A
签到
#include<bits/stdc++.h> using namespace std; int n,m,s[2],t[2],ans; int main() { scanf("%d%d",&n,&m); for(int i=1,x;i<=n;i++)scanf("%d",&x),s[x&1]++; for(int i=1,x;i<=m;i++)scanf("%d",&x),t[x&1]++; ans=min(s[0],t[1])+min(s[1],t[0]); printf("%d",ans); }
B
要求40次,而log(1e6)≈20,也就是说最多20个二进制位,可以每次翻转最高的“0”位,然后再+1即可。证明:若为11...10...00,则翻转最高0位后直接结束;若为全1,也是直接结束;若后面存在1,翻转后必然存在0,使得最高位向后走。
#include<bits/stdc++.h> using namespace std; int n,m,tim,a[1000]; bool judge(int x) { int flag=1; for(int i=30;i>=0;i--) if(x&(1<<i))flag=0; else if(!flag)return 0; return 1; } int main() { cin>>n; while(!judge(n)) { tim++; if(tim&1) { int flag=1; for(int i=30;i>=0;i--)if(n&(1<<i))flag=0;else if(!flag){a[++m]=i+1;break;} n^=(1<<a[m]+1)-1; } else n++; } printf("%d\n",tim); for(int i=1;i<=m;i++)printf("%d ",a[i]); }
C
签到,开始还看成了最大公约数,自闭。其实就是枚举差值的每个因数,暴力加一下即可。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll a,b,d,ans,mn; void work(ll x) { ll t=(x-a%x)%x,A=a+t,B=b+t,g=A/__gcd(A,B)*B; if(g<mn)mn=g,ans=t; else if(g==mn&&t<ans)ans=t; } int main() { cin>>a>>b; if(a==b){cout<<0;return 0;} if(a>b)d=a-b;else d=b-a; mn=a/__gcd(a,b)*b; for(ll i=1;i*i<=d;i++) if(d%i==0)work(i),work(d/i); cout<<ans; }
D
被这题搞自闭了,看到什么最大值对1e9+7取模以为是个神仙题,后来才发现是个SB贪心题,其实就是能选的边尽量选,后来证明了一下:只有一个儿子显然,有两个儿子可以证明:如果自己能选没选,那么两个儿子的边也只能选1个,还会影响后面,如果自己不能选,随机选一个是也是对的。然后可以f[i][j][0/1]表示走了i步,前缀和为j,该点与父亲的边是否被选的节点数有几个,直接暴力转移即可。
#include<bits/stdc++.h> using namespace std; const int N=1007,mod=1e9+7; int n,ans,f[2*N][N][2]; void add(int&x,int y){x=(x+y)%mod;} int main() { scanf("%d",&n); f[1][1][1]=1; for(int i=1;i<=2*n;i++) for(int j=0;j<=n;j++) { int lc=n+1,rc=n+1; if(j+1<=2*n-i-1)lc=j+1; if(j)rc=j-1; if(lc>n&&rc>n)continue; if(f[i][j][0]) { if(lc<=n&&rc<=n)add(f[i+1][lc][1],f[i][j][0]),add(f[i+1][rc][0],f[i][j][0]); else if(lc<=n)add(f[i+1][lc][1],f[i][j][0]); else add(f[i+1][rc][1],f[i][j][0]); } if(f[i][j][1]) { if(lc<=n)add(f[i+1][lc][0],f[i][j][1]); if(rc<=n)add(f[i+1][rc][0],f[i][j][1]); } } for(int i=1;i<=2*n;i++) for(int j=0;j<=n;j++) if(f[i][j][1])add(ans,f[i][j][1]); printf("%d",ans); }
E
自闭不会,咕。
F
神仙题,弃疗,咕,争取订正出F1吧。
新号打的,初始语言默认C差评,被卡了十几分钟CE不知道,十分不爽。
result:rank95 rating+=225 now_rating=1725