2026/1/9 6:48:51
网站建设
项目流程
公司注销预审在什么网站做,网站前置或专项审批,百度推广要多少钱,酒店 网站构建P2039 [AHOI2009] 跳棋
题目描述
在一个 111 行 NNN 列#xff08;NNN 是奇数#xff09;的棋盘上#xff0c;有 KKK 个格子是红色的。这种情况下#xff0c;你有一个跳棋在最左端的格子上。你的目标是将它移动到最右边的格子#xff0c;在开始移动之间#xff0c;你可以…P2039 [AHOI2009] 跳棋题目描述在一个111行NNN列NNN是奇数的棋盘上有KKK个格子是红色的。这种情况下你有一个跳棋在最左端的格子上。你的目标是将它移动到最右边的格子在开始移动之间你可以在棋盘的任意空位上放棋子。在游戏开始后 你只可以随时在一个红色格子上放棋子。棋子的移动规则是每次只可以选择一个棋子跳过与之相邻的棋子走到后面的空格上被它跳过的棋子被吃掉即从棋盘上移走如相邻棋子的另一侧有棋子则不能跳。请回答以下两个问题移动开始前至少要放多少棋子才能完成任务。如果要使开始前放的棋子数要求尽量少那么在移动过程中最少需要放多少个棋子才能完成任务。关于规则的补充说明只能往空位上放棋子不管是移动开始前还是移动过程中。移动前棋盘最左端的那个原始棋子绝对不能被吃掉。输入格式第一行一个正奇数NNN。第二行有NNN个整数如果第iii个整数是111说明第iii个格子是红色格子否则为白色格子。数字间用空格分开。输出格式两行每行一个整数分别代表第一问和第二问的结果。输入输出样例 #1输入 #15 0 0 0 1 0输出 #11 1说明/提示在游戏开始前可以在第二个格子上放上一个棋子游戏开始后可用最左边的棋子吃掉它从而移动到第三格。然后由于第四格是个红色的格子在游戏中可以在那放一个棋子然后用已经移动第三格的棋子把它吃掉从而达到终点。100%100\%100%的数据中1≤N≤10001\le N\le 10001≤N≤1000输出中的数字不超过101510^ {15}1015。30%30\%30%的数据中N≤20N\le 20N≤20。Source: [Ahoi2009] checkerC实现#includestdio.h#includestdlib.h#definemaxn1005#defineINF1e18#defineLLlonglongLL n,q[maxn],num[2];LL dp[maxn];LLmin(LL a,LL b){returnab?a:b;}voidprint(boolflag){//输出函数if(!flag){printf(%lld\n%lld,num[0],num[1]);exit(0);//直接结束程序}LL ans0;for(inti1;in;i)ans(i%2)?0:dp[i];//只有偶数点才计入答案printf(%d\n%lld,0,ans);}intmain(){boolflagfalse;scanf(%lld,n);for(LL i1;in;i){scanf(%lld,q[i]);if(i1){q[i]0;//起点的红点没有用故赋值为 0作为白点处理continue;}if(i%20)num[q[i]];if(q[i]q[i-1])flagtrue;}for(inti1;in;i)dp[i]q[i]?1:INF;for(inti3;in;i)if(q[i]q[i-1]){for(intji-2;j1;j--)dp[j]min(dp[j],dp[j1]dp[j2]);//跳棋向左边跳for(intji1;jn;j)dp[j]min(dp[j],dp[j-1]dp[j-2]);//跳棋向右边跳}print(flag);return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容