华为出的比赛?
好像是全站首个题解哎!
比赛链接:ABC342
Problem A:
稍微有点含金量的签到题。
#include <bits/stdc++.h>
using namespace std;
int main(){
string S;
cin>>S;
for(int i=0;i<s.size();i++){
if(count(S.begin(),S.end(),S[i])==1){//数有多少个字符
cout<<find(S.begin(),S.end(),S[i])-S.begin()+1<<endl;//找它的位置
return 0;
}
}
}
Problem B:
依然是签到题。
#include <bits/stdc++.h>
using namespace std;
int P[105];
int main(){
int N;
cin>>N;
for(int i=0;i<N;i++){
int p;
cin>>p;
p--;
P[p]=i;
}
int Q;
cin>>Q;
while(q--){
int A,B;
cin>>A>>B;
A--;
B--;
if(P[A]>P[B])
swap(A,B);
cout<<A+1<<endl;
}
return 0;
}
Problem C:
首先,要明确暴力是过不了的,所以必须优化。用一个数组记录改动信息,这样复杂度只有,因为一共就26个字母嘛。
#include <bits/stdc++.h>
using namespace std;
int to[26];
int main(){
for(int i=0;i<26;i++)
to[i]=i;
int N;
cin>>N;
string S;
cin>>S;
int Q;
cin>>Q;
while(Q--){
char c,d;
cin>>c>>d;
for(int i=0;i<26;i++){
if(to[i]==c-'a')
to[i]=d-'a';
}
}
for(int i=0;i<n;i++)
cout<<char('a'+to[S[i]-'a']);
return 0;
}
感觉比以往的C简单一些。
Problem D:
数论题。我们知道,完全平方数的所有质因子的质数都是偶数(唯一分解定理),所以我们每次把除质因子p的平方,直到除不尽为止。最后还要特判一下0(它跟谁乘都是完全平方)。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int A[maxn],cnt[maxn];
int main(){
int N;
cin>>N;
for(int i=1;i<=N;i++)
cin>>A[i];
int ans=0,t=n-1;//十年OI一场空,不开long long见祖宗
for(int i=1;i<=N;i++){
for(int j=2;j<=A[i]/j;j++){
while(A[i]%(j*j)==0)
A[i]/=(j*j);
}
if(A[i]==0){
ans+=t;
t--;
}
else{
ans+=cnt[A[i]];
cnt[A[i]]++;
}
}
cout<<ans<<endl;
return 0;
}
ok,以上就是本期的全部内容。(up实力有限,只会A-D)我们下期再见!
友情提醒:本期的全部代码都有问题,请不要无脑Ctrl C+Ctrl V