个人感觉这次D有点难。
比赛链接:ABC347
Problem A:
签到题。
#include <bits/stdc++.h>
using namespace std;
int main(){
int N,K;
cin>>N>>K;
for(int i=1;i<=N;i++){
int A;
cin>>A;
if(A%K==0)
cout<<A/K;
}
return 0;
}
Problem B:
主要考substr的用法。
#include <bits/stdc++.h>
using namespace std;
int main(){
string S;
cin>>S;
set<str> st;
for(int i=0;i<S.size();i++){
for(int j=0;j<=i;j++)
st.insert(S.substr(j,i-j+1));
}
cout<<st.size()<<endl;
return 0;
}
Problem C:
把每个模,排序后判断是否小于即可。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int D[maxn];
int main(){
int N,A,B;
cin>>N>>A>>B;
for(int i=1;i<=N;i++){
cin>>D[i];
D[i]%=(A+B);
}
sort(D+1,D+N+1);
if(D[N]-D[1]<A){
cout<<"Yes"<<endl;
return 0;
}
cout<<"No"<<endl;
return 0;
}
咦,怎么Wrong Answer on test 28?
那是因为我们漏考虑了如果每个之间都相差的情况。加上这个方可通过本题。
#include <bits/stdc++.h>
using namespace std;
const int maxn=200005;
int D[maxn];
int main(){
int N,A,B;
cin>>N>>A>>B;
for(int i=1;i<=N;i++){
cin>>D[i];
D[i]%=(A+B);
}
sort(D+1,D+N+1);
if(D[N]-D[1]<A){
cout<<"Yes"<<endl;
return 0;
}
for(int i=1;i<=N;i++){
if((D[i-1]-D[i])<A){//要加上A+B
cout<<"Yes"<<endl;
return 0;
}
}
cout<<"No"<<endl;
return 0;
}
Problem D:
首先,我们知道和。
所以,令,,这样可以满足。
现在,我们来想如何满足和。
我们可以把一些的挪到上头去,这样仍然满足。
那位数不够怎么办?简单,把满足的和都变成1好了。
当然,为了让它们更匀称,我们要使尽量接近即可。
//十年OI一场空,不开ull见祖宗
#include <bits/stdc++.h>
using namespace std;
bitset<60> X,Y;
int main(){
int a,b,C;
cin>>a>>b>>C;
X=C;
int cnt=0,res=(X.count()+b-a)/2;
for(int i=0;cnt<res && i<60;i++){
if(X[i]){
X[i]=0;
Y[i]=1;
cnt++;
}
}
cnt=0,res=a-X.count();
for(int i=0;cnt<res && i<60;i++){
if(!X[i] && !Y[i]){
X[i]=Y[i]=1;
cnt++;
}
}
if(X.count()!=a || Y.count()!=b || (X.to_ullong()^Y.to_ullong())!=C)
cout<<-1<<endl;
else
cout<<X.to_ullong()<<' '<<Y.to_ullong()<<endl;
return 0;
}
天神1ms!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
好了,以上就是本期的全部内容了,我们下期再见!o(* ̄︶ ̄*)o
温馨提示:本期的代码都有问题,请勿Ctrl C+Ctrl V