4 条题解
-
-2
本文由GPT5.6撰写
题解
设二进制数为:
因为
所以这个数除以
3的余数等于:因此问题变成:
让奇数位置的 1 数量 − 偶数位置的 1 数量是
3的倍数。
贪心
我们从左往右确定每一位。
- 求字典序最大:优先尝试放
1 - 求字典序最小:优先尝试放
0 - 第一位不能放
0
假设当前尝试放了
x,那么剩下r个1。设剩下有
O个奇数位置、E个偶数位置。如果剩余的
1中有y个放在奇数位置,那么:个放在偶数位置,所以剩余贡献为:
其中:
我们只需要判断这个区间里是否存在一个
y,使最终的:因为只看模
3,所以实际上只需要检查最多 3 个y。
复杂度
每个位置只尝试
0/1两种情况,每次判断O(1)。所以:
空间复杂度:
核心代码
string work(int big){ int N=n+m,one=n,sum=0; string s; for(int i=1;i<=N;i++){ int O=(N+1)/2-(i&1),E=N/2-!(i&1); for(int x=big;x>=0;x--){ if((i==1&&x==0)||x>one) continue; int r=one-x; if(r>O+E) continue; int l=max(0,r-E),R=min(r,O); int t=(sum+(x?(i&1?1:-1):0))%3; if(t<0)t+=3; bool ok=0; for(int y=l;y<=min(R,l+2);y++) if((t+2*y-r)%3==0) ok=1; if(ok){ s+=x+'0'; one-=x; if(x) sum+=i&1?1:-1; break; } } } return one||sum%3?"-1":s; }一句话总结:利用
2≡-1 (mod 3)把整串转成奇偶位置计数,然后从左到右贪心,每次判断剩余的 1 能否补出模 3 的合法方案。 - 求字典序最大:优先尝试放
信息
- ID
- 2741
- 时间
- 2000ms
- 内存
- 128MiB
- 难度
- 4
- 标签
- (无)
- 递交数
- 25
- 已通过
- 11
- 上传者