蓝桥杯练习题库3算法训练之VIP题解答.doc

  1. 1、本文档共175页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法训练 黑白无常 ? 时间限制:1.0s ? 内存限制:256.0MB ???????查看参考代码 问题描述   某寝室的同学们在学术完之后准备玩一个游戏:游戏是这样的,每个人头上都被贴了一张白色或者黑色的纸,现在每个人都会说一句话“我看到x张白色纸条和y张黑色的纸条”,又已知每个头上贴着白色纸的人说的是真话、每个头上贴着黑色纸的人说的是谎话,现在要求你判断哪些人头上贴着的是白色的纸条,如果无解输出“NoSolution.”;如果有多组解,则把每个答案中贴白条的人的编号按照大小排列后组成一个数(比如第一个人和第三个人头上贴着的是白纸条,那么这个数就是13;如果第6、7、8个人都贴的是白纸条,那么这个数就是678)输出最小的那个数(如果全部都是黑纸条也满足情况的话,那么输出0) 输入格式   第一行为一个整数n,接下来n行中的第i行有两个整数x和y,分别表示第i个人说“我看到x张白色纸条和y张黑色的纸条”。 输出格式   一行。如果无解输出“NoSolution.”。否则输出答案中数值(具体见问题描述)最小的那个,如果全部都是黑纸条也满足情况的话,那么输出0 样例输入 2 1 0 1 0 样例输出 0 样例输入 5 3 1 0 4 1 3 4 0 1 3 样例输出 35 数据规模和约定   n=8 #include stdio.h #include math.h int n; int x[8],y[8]; int isok(int a[],int num,int value) //第i个人的话是否成立 num为人下标 value 为 0白 或者 1黑 { int black=0,white=0,i; for(i=0;in;i++) { if(i!=num) { if(a[i]) black++; //黑色 else white++; //白色 } } if(value) //黑 { if(x[num]==white y[num]==black) return 0; else return 1; } else //白 { if(x[num]==white y[num]==black) return 1; else return 0; } } int main() { int i,j,k,sign,minnum; int a[8],b[8]; scanf(%d,n); for(i=0;in;i++) scanf(%d%d,x+i,y+i); for(i=0;ipow(2,n);i++) { k=i; for(j=0;jn;j++) { a[j]=k%2; k/=2; } sign=1; for(j=0;jn;j++) { if(isok(a,j,a[j])==0) { sign=0; break; } } if(sign) { k=1; num=0; for(j=n-1;j=0;j--) { if(a[j]==0) { num+=k*(j+1); k*=10; } } if(nummin) min=num; } } if(min= printf(NoSolution.); else { for(i=0;in;i++) b[i]=1; for(i=0;in;i++) { if(isok(b,i,b[i])==0) { sign=0; break; } } if(sign==0) printf(%d,min); else printf(0); } return 0; } #includestdio.h #includestring.h #includemath.h int mt[9][2],n; int max[9]={9}; int xl[9]={9}; bool ifc(); int main() { int i,j,m,fi,k,flag; scanf(%d,n); for(i=1;i=n;i++) scanf(%d %d,mt[i][0],mt[i][1]); m=pow(2,n); for(i=0;im;i++) { for(fi=i,j=1,xl[0]=0;j=n;j++) { xl[j]=fi1; fi=1; if(xl[j]) xl[0]++;//真话数量 } if(xl[0]max[0]) c

文档评论(0)

妈妈王子 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档