BZOJ4893 项链分赃
第一次出题233
先给出结论,切的刀数一定小于等于颜色个数。
所以暴力判掉1和2,剩下输出3就行了。
你肯定会问“为什么?!”
让我尝试证明一下这个东西。
--------------------------------以下开始证(瞎)明(扯)环节--------------------------------
假设地球是一个完美的球体,而且气温和气压的变化是连续的,那么地球上一定存在一对相对的点气温和气压都相等。
证明:
假设你和你的女朋友都绕赤道走了半圈,且时刻保持你们两个所处的位置相对。
我们把赤道上气温气压的图像画出来,大概是这个样子的:
你初始在A,你女朋友初始在B,最终你们两个交换位置,那么你和你的女朋友一定存在某个时刻气压相等,我们把气压相等的那两个点拿出来。
把所有这样类似赤道的弧都这么做得到两点,并把这两点都画出来,大概是这个样子:
你初始在A,走的路线为绿线,你女朋友初始在B,走的路线为红线,走的过程时刻保持气压相等,最终交换位置,那么中途肯定存在一个点(点C),使得你和你女朋友气温气压都相等。
用数学语言描述一下就是,存在一个点(x,y,z),使得f(x,y,z)=f(-x,-y,-z).
那么这个地球问题就证(扯)完了。
到现在你可能觉得我在扯淡,所以这跟这道题有什么关系呢。
我们先把这个项链从离散变为连续的,即如果以前是这样:
那么我们把它变成这样:
可以发现如果从中间切开,不会影响答案。
假如只有两个颜色,设整个项链为1,你切两刀分为了三段,长度分别为x2,y2,z2,那么满足x2+y2+z2=1,它对应地球上的一个点(x,y,z),x,y,z的两个根分别对应分给海盗1和2。
比如x=√22,y=−√33,z=√66,x,z是正数就意味着给海盗1,y是负数就意味着给海盗2.
那么又因为变化是连续的,所以必然存在f(x,y,z)=f(-x,-y,-z),这表明两个海盗交换后没有变,也就是每种颜色数目都相等。
当颜色数更多的时候,就相当于k维球做这些事情,方法基本相同。
如果你能看懂我丑陋的证明,应该会恍然大悟,拓扑学就是这么的美妙。
#include <cstdio> #include <map> using namespace std; #define mk(a,b) make_pair(a,b) int n,s[3],t[3],a[100005]; map<pair<int,pair<int,int> >,int> mp; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]),s[a[i]]++; for(int i=1;i<=n;i++) { t[a[i]]++; if(s[0]==t[0]*2&&s[1]==t[1]*2&&s[2]==t[2]*2) return puts("1"),0; } t[0]=t[1]=t[2]=0; for(int i=1;i<=n;i++) { t[a[i]]++; if(mp[mk(t[0]-s[0]/2,mk(t[1]-s[1]/2,t[2]-s[2]/2))]) return puts("2"),0; mp[mk(t[0],mk(t[1],t[2]))]=1; } return puts("3"),0; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?