CF彩笔题解1651 AtoC
A
分析
1<<x即为2^n.第一轮是奇数全胜,后面全剩奇数所以和一定是偶数所以总是数字大的赢.以答案是 1~2^n
范围内最大的奇数
AC代码
#include<iostream> #include<cmath> using namespace std; int a[40]; int main() { int T; cin>>T; while(T--) { int x,t=0; cin>>x; cout<<(1<<x)-1<<endl; } return 0;}
B
分析
ai-aj要比原来大,,所以一个数至少要是另外一个数字的3 倍,ai=3*aj 就行
AC代码
#include<iostream> using namespace std; int main() { int T; cin>>T; while(T--) { int n; cin>>n; if(n>19) puts("NO");//3^19=1,162,261,467 else { puts("YES"); int t=1; for(int i=1;i<=n;i++) { cout<<t<<endl; t*=3;//ai-aj要比原来大,ai=3*aj } puts(""); } } return 0;}
C
分析
最简单的就是形成一个环:
a[1]<--->b[1],a[n]<---->b[n] or a[1]<--->b[n],a[1]<---->b[n]
第二种情况形成多个环:让每一个电脑的度>=2即可,然后是暴力枚举找最优情况
AC代码
#include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int N=200010; int a[N],b[N]; int main() { int T; cin>>T; while(T--) { int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; LL sum=0; for(int i=0;i<n;i++) cin>>b[i]; sum=min(abs(a[0]-b[0])+abs(a[n-1]-b[n-1]),abs(a[0]-b[n-1])+abs(a[n-1]-b[0])); LL ans1,ans2,ans3,ans4; ans1=ans2=ans3=ans4=sum; for(int i=0;i<n;i++) { if(ans1>abs(a[0]-b[i])) ans1=abs(a[0]-b[i]); if(ans2>abs(b[0]-a[i])) ans2=abs(b[0]-a[i]); if(ans3>abs(a[n-1]-b[i])) ans3=abs(a[n-1]-b[i]); if(ans4>abs(b[n-1]-a[i])) ans4=abs(b[n-1]-a[i]); } sum=min(ans1+ans2+ans3+ans4,sum); sum=min(ans1+ans2+abs(a[n-1]-b[n-1]),sum); sum=min(ans3+ans4+abs(a[0]-b[0]),sum); sum=min(ans1+ans4+abs(a[n-1]-b[0]),sum); sum=min(ans2+ans3+abs(a[0]-b[n-1]),sum); cout<<sum<<endl; } return 0;}
#include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; const int N=200010; int a[N],b[N]; int main() { int T; cin>>T; while(T--) { int n; cin>>n; for(int i=0;i<n;i++) cin>>a[i]; LL sum=0; for(int i=0;i<n;i++) cin>>b[i]; sum=min(abs(a[0]-b[0])+abs(a[n-1]-b[n-1]),abs(a[0]-b[n-1])+abs(a[n-1]-b[0])); LL ans1,ans2,ans3,ans4; ans1=ans2=ans3=ans4=sum; for(int i=0;i<n;i++) { if(ans1>abs(a[0]-b[i])) ans1=abs(a[0]-b[i]); if(ans2>abs(b[0]-a[i])) ans2=abs(b[0]-a[i]); if(ans3>abs(a[n-1]-b[i])) ans3=abs(a[n-1]-b[i]); if(ans4>abs(b[n-1]-a[i])) ans4=abs(b[n-1]-a[i]); } sum=min(ans1+ans2+ans3+ans4,sum); sum=min(ans1+ans2+abs(a[n-1]-b[n-1]),sum); sum=min(ans3+ans4+abs(a[0]-b[0]),sum); sum=min(ans1+ans4+abs(a[n-1]-b[0]),sum); sum=min(ans2+ans3+abs(a[0]-b[n-1]),sum); cout<<sum<<endl; } return 0;}

浙公网安备 33010602011771号