- 1、本文档共175页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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
样例输入
21 01 0
样例输出
0
样例输入
53 10 41 34 01 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)