这个题的证明有点妙啊
结论是 切得刀数不超过颜色数
先扯那个地球问题 二维的情况也就是在圆周上 因为两者互换位置 两条图线必定有交点 就证完了
三维 在球面上 我们固定一维转动 看做无数个圆周 都可以找出两点气压一样 又因为函数连续 那么这两点的移动也是连续的 这样就锁定了一维必定相等 也就把问题压低了一维 也就是跟上面同理
然后这有什么用呢 这其实是跟两种颜色对应的问题是等价的
首先在这个题里离散和连续没什么大问题
然后任一切法一一对应到了球面上任一点
找到两点气压气温相同 也就是红色的差和绿色的差相同 那么说明差就是0
至于三种颜色 在四维球面上做就好了 反正证明是归纳式的
BTW 【官方双语】用球面映射巧解分赃难题:拓扑学的另一妙用
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<set>
using namespace std;
#define mp(a,b) make_pair(a,b)
const int N=100005;
int n,a[N],b[3],c[3];
set<pair<int,pair<int,int> > > Set;
int main(){
freopen("t.in","r",stdin);
freopen("t.out","w",stdout);
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",a+i),b[a[i]]++;
b[0]>>=1; b[1]>>=1; b[2]>>=1;
for (int i=1;i<=n;i++){
c[a[i]]++;
if (b[0]==c[0] && b[1]==c[1] && b[2]==c[2]) return printf("1\n"),0;
}
c[0]=c[1]=c[2]=0;
for (int i=1;i<=n;i++){
c[a[i]]++;
if (Set.count(mp(c[0]-b[0],mp(c[1]-b[1],c[2]-b[2])))) return printf("2"),0;
Set.insert(mp(c[0],mp(c[1],c[2])));
}
return printf("3\n"),0;
}