打卡信奥刷题(3075)用C++实现信奥题 P7006 [NEERC 2013] Kabaleo Lite

张开发
2026/4/7 16:52:08 15 分钟阅读

分享文章

打卡信奥刷题(3075)用C++实现信奥题 P7006 [NEERC 2013] Kabaleo Lite
P7006 [NEERC 2013] Kabaleo Lite题目描述有一种棋盘游戏棋盘上有nnn个格子每个格子上可以堆叠若干个有颜色的筹码只有每个格子中最上方的筹码的颜色是可见的。参加游戏的每个玩家都有各自不同的一个目标颜色以及一些彩色筹码。每个人只知道自己的目标颜色但各自拥有的筹码颜色和数量都是公开的。每个回合中所有玩家轮流在棋盘上选一个格子放置筹码同时覆盖下方的筹码。游戏结束后数出棋盘上可见筹码数最多的颜色以该颜色为目标颜色的玩家即获胜。若该颜色不是任何玩家的目标颜色或者棋盘上出现最多的颜色不唯一则游戏平局。现在一局游戏进行到了最后你和其他所有玩家都只剩最后一个筹码。现在恰好轮到你操作在不知道其他人的目标颜色的前提下你想知道你一共有哪些操作可以保证必胜。输入格式第一行444个整数n,p,c,hn,p,c,hn,p,c,h分别表示棋盘格数、玩家数、筹码颜色总数和你的目标颜色第二行nnn个整数bib_ibi​表示棋盘上现有的筹码颜色棋盘格编号从111开始第三行ppp个整数lil_ili​表示每个玩家的最后一枚筹码的颜色玩家编号从你开始。输出格式第一行111个整数www表示你有多少种必胜操作。第二行www个整数mim_imi​表示你应该把筹码放在哪个格子上。顺序不限。输入输出样例 #1输入 #16 3 4 2 2 1 2 3 2 2 2 1 1输出 #11 2说明/提示1≤n≤1061\leq n\leq 10^61≤n≤1061≤p≤c≤1061\leq p\leq c\leq 10^61≤p≤c≤1061≤h,bi,li≤c1\leq h,b_i,l_i\leq c1≤h,bi​,li​≤c。C实现#includebits/stdc.h#defineR(i,a,b)for(inti(a),i##E(b);ii##E;i)#defineL(i,a,b)for(inti(b),i##E(a);ii##E;i--)usingnamespacestd;intn,p,c,h;intb[1111111],cnt[1111111];intl[1111111];vectorintans;intmx,mmx,cy;inlineintcheck(intx){if(n1l[p]h)return1;--cnt[b[x]];cnt[l[1]];intdelcnt[h]-cy;boolok1;if(del0)ok0;if(cnt[mx]del)ok0;if(cnt[mmx]del)ok0;if(l[1]!hcnt[l[1]]del)ok0;cnt[b[x]];--cnt[l[1]];returnok;}signedmain(){ios::sync_with_stdio(false);cin.tie(NULL);cinnpch;R(i,1,n)cinb[i],cnt[b[i]];R(i,1,p)cinl[i];R(i,2,p)if(l[i]!h)cy,cnt[l[i]];R(i,1,c)if(i!h){if(cnt[i]cnt[mx])mmxmx,mxi;elseif(cnt[i]cnt[mmx])mmxi;}R(i,1,n)if(check(i))ans.emplace_back(i);coutans.size()endl;for(intx:ans)coutx ;coutendl;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容

更多文章