[bzoj4893]项链分赃

来自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;
}
posted @ 2017-05-14 19:07  FallDream  阅读(380)  评论(0编辑  收藏  举报