来自FallDream的博客,未经允许,请勿转载,谢谢。
有一串长度为n(n<=10^5)的项链,上面有红绿蓝三种颜色的珠子,每种颜色的珠子数目都是偶数,现在要你把它切几刀分成若干段,把其中一些段分给海盗1,剩余的段分给海盗2,要求两个海盗分得的每种颜色的珠子数量都相同,请输出最少需要切多少刀。
感觉是到智商题 想了很久不懂怎么做开始猜结论
感觉答案不会超过3 就判掉了答案是1和2的情况,然后就过了233
然后又想了很久 根本不会证明qaq
去出题人博客上看了看证明 真的神 我是服了.. 给个链接吧。
#include<cstdio> #define getchar() (*S++) #define MN 100000 char B[1<<26],*S=B; using namespace std; inline int read() { int x = 0; char ch = getchar(); while(ch < '0' || ch > '9') ch = getchar(); while(ch >= '0' && ch <= '9')x = x * 10 + ch - '0',ch = getchar(); return x; } int n,N,a[MN+5],tot[3]; int main() { fread(B,1,1<<26,stdin); n=read();N=n>>1; for(register int i=1;i<=n;++i) ++tot[a[i]=read()]; tot[0]>>=1;tot[1]>>=1;tot[2]>>=1; for(register int i=1;i<=N;++i) --tot[a[i]]; if(!tot[0]&&!tot[1]&&!tot[2]) return 0*puts("1"); for(register int i=1,j=N;j<n;++tot[a[i++]],--tot[a[++j]]) if(!tot[0]&&!tot[1]&&!tot[2]) return 0*puts("2"); puts("3"); return 0; }