2022.04.11(Educational Codeforces Round 126 (Rated for Div. 2))
说明:反正是要 最后的总和,那么肯定是在ai,ai+1,bi,bi+1四个数中最小的数和最小的数在一起,归根结底就是ab数组对应位置的上,小的数在a数组,大的数在b数组,如果不满足就交换位置
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<map> #include<set> using namespace std; const int maxx=1e5+10; int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); int a[maxx]; int b[maxx]; for(int i=0;i<n;i++){ scanf("%d",&a[i]); } for(int i=0;i<n;i++){ scanf("%d",&b[i]); } for(int i=0;i<n;i++){ if(a[i]>b[i]){ swap(a[i],b[i]); } } long long int sum=0; for(int i=0;i<n-1;i++){ sum+=abs(a[i]-a[i+1]); sum+=abs(b[i]-b[i+1]); } printf("%lld\n",sum); } }
说明:我们发现32768是2^15,那么最多也就是形成14个0,一个1,一直*2最多就是需要15步。那么加一最多也就是32768-n。如果再有最小的话就是最多加15个再乘2,如果边乘边加的话,那么刚构造出来的0还是没有意义的。那么我们直接去用15去模拟先+1、后*2的步数。
wa掉的点:
(1)首先想到二进制关于左移和+1的过程,又觉得肯定是看1与0的个数,可是这样有两个地方有问题:首先是很复杂,难以去模拟;再就是当初考虑的时候,想的太浅了,只想到个位往前一步,但是牵一发而动全身,这里也是错误的
(2)再就是知道了是15有关的数,结果肯定是比15小,那么为什么不用15去模拟呢?
(3)关于15没有想到,还是没深刻感受到,+1、*2必须是先+1后*2,消除1排列很多并且个位构成的0串很小的情况
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #include<map> #include<set> using namespace std; const int maxx=1e5+10; int main(){ int n; scanf("%d",&n); for(int i=0;i<n;i++){ int j=0; int num; scanf("%d",&num); int minn=20; for(int k=0;k<=15;k++){ int ns=(k+num)%32768; int sum=k; while(ns!=0){ ns*=2; sum++; ns%=32768; } minn=min(minn,sum); } printf("%d ",minn); } }
说明:天数构成的1212121……,我们首先去分配奇数,奇数必有至少一个1,偶数我们先不考虑,这样的话我们先把1个1拿走,然后剩下的都是偶数,这样就可以比较一下1构成的2是不是可以满足剩下的那些偶数和
wa掉的点:
(1)无开long long
(2)老是去想哪天休息,其实这样的话会很乱,我们应该以1为主线,剩下的就都是2了,真的很妙
代码:
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> using namespace std; const int maxx=3e5+10; int a[maxx]={0}; int n; long long solve(int maxp){ long long int ans=0; long long int sum=0; for(int i=0;i<n;i++){ if((maxp-a[i])%2){ ans++; } sum+=maxp-a[i]; } return max(ans*2-1,sum/3*2+sum%3); } int main(){ int t; scanf("%d",&t); while(t--){ scanf("%d",&n); int maxp=0; int sum=0; int ans=0; for(int i=0;i<n;i++){ scanf("%d",&a[i]); maxp=max(maxp,a[i]); } printf("%lld\n",min(solve(maxp),solve(maxp+1))); } }