ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

打卡信奥刷题(3527)用C++实现信奥题 P10961 划分大理石

打卡信奥刷题(3527)用C++实现信奥题 P10961 划分大理石 P10961 划分大理石题目描述有价值分别为1,2,…,61,2,\dots,61,2,…,6的大理石各a1,a2,…,a6a_1,a_2,\dots,a_6a1​,a2​,…,a6​块现要将它们分成两部分使得两部分价值之和相等问是否可以实现。其中大理石的总数不超过200002000020000。输入格式本题有多组数据每组数据以单独的一行666个整数呈现分别表示a1,a2,…,a6a_1,a_2,\dots,a_6a1​,a2​,…,a6​。如果一行中666个整数均为000表示输入文件结束。对于每一个测试点有效测试数据组数不超过100100100组。输出格式对于每一组数据如果划分成功输出Can否则输出Cant。输入输出样例 #1输入 #14 7 4 5 9 1 9 8 1 7 2 4 6 6 8 5 9 2 1 6 6 1 0 7 5 9 3 8 8 4 0 0 0 0 0 0输出 #1Cant Can Cant Cant CanC实现#includebits/stdc.husingnamespacestd;inta[7];intw[20001];booldp[210001];intmain(){inttot;while(scanf(%d%d%d%d%d%d,a[1],a[2],a[3],a[4],a[5],a[6])){if((a[1]a[3]a[5])%2!0){//不是偶数就直接输出Cantprintf(Cant\n);continue;}memset(dp,0,sizeof(dp));//多测清空tot0;if(a[1]0a[2]0a[3]0a[4]0a[5]0a[6]0){return0;}intjs(a[1]a[2]*2a[3]*3a[4]*4a[5]*5a[6]*6)/2;//计算sum/2for(inti1;i6;i){intbase1;while(basea[i]){//二进制拆分a[i]-base;w[tot]base*i;//体积和价值也等比例放大base*2;}if(a[i]!0){//这里别忘记把多余的加进去w[tot]a[i]*i;}}dp[0]1;for(inti1;itot;i){//完全背包for(intjjs;jw[i];j--){//遍历顺序别反了if(dp[j-w[i]]){dp[j]1;}}}if(dp[js]){//假如sum/2可以printf(Can\n);}else{printf(Cant\n);}}return0;}后续接下来我会不断用C来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现记录日常的编程生活、比赛心得感兴趣的请关注我后续将继续分享相关内容
返回列表