agc002 E - Candy Piles
题意:
n 堆石子,两个人轮流操作,每次操作可以拿完最多的一堆或者每堆拿一个。拿走最后一个石子的人输
思路:
把 从大到小排序。转化一下题中的操作:拿完最多的一堆就是删除最左的那列,就是往右走一步;每堆拿一个就是删除最下的那行,就是往上走一步。画图一直画到没有石子的状态(称为空点),考虑边界点的状态怎么确定(这里认为空点在边界之外):若某点的上、右邻点均为空点,那他就是必败点,在图上这种点位于 “ 形拐角” 处;否则它的状态取决于往上到拐角点和往右到拐角点的距离的奇偶性。
知道了边界点的状态就可以推出其他所有点的状态。但是把所有点都推出来太慢了。实际上每条 左下-右上 45度线上的点的状态都一样。所以只需关心从起点出发一直45度往右上走到的那个边界点是什么状态
void sol() {
cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + 1 + n, greater<int>());
int x = 1, y = 1; while(a[x+1] >= y+1) x++, y++;
bool s1 = (a[x]-x)%2, s2 = 0;
while(a[x+1] >= y) x++, s2 ^= 1;
cout << (s1 || s2 ? "First" : "Second");
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】