首页 > 代码库 > POJ2912 Rochambeau (hard?or!hard?)
POJ2912 Rochambeau (hard?or!hard?)
Description
N children are playing Rochambeau (scissors-rock-cloth) game with you. One of them is the judge. The rest children are divided into three groups (it is possible that some group is empty). You don’t know who is the judge, or how the children are grouped. Then the children start playing Rochambeau game for M rounds. Each round two children are arbitrarily selected to play Rochambeau for one once, and you will be told the outcome while not knowing which gesture the children presented. It is known that the children in the same group would present the same gesture (hence, two children in the same group always get draw when playing) and different groups for different gestures. The judge would present gesture randomly each time, hence no one knows what gesture the judge would present. Can you guess who is the judge after after the game ends? If you can, after how many rounds can you find out the judge at the earliest?
题目大意:(剪子包袱锤~~)不过,多了个美丽的judge,可以随便出任何种手势。判断能否根据已知的游戏的结果选出judge。。。
思路:基本用食物链。。。不过。。。多了个美丽的judge,就困难了些。。。提高到了baidustart的难度(06年~~)。
枚举每个小孩为judge,判断他为judge时在第几句话出错falt[i](即到第几句话能判断该小孩不是judge)。
1. 如果只有1个小孩是judge时全部语句都是正确的,说明该小孩是judge,那么判断的句子数即为其他小孩的falt[i]的最大值。如果
2. 如果每个小孩的都不是judge(即都可以找到出错的语句),那么就是impossible。
3. 多于1个小孩是judge时没有找到出错的语句,就是Can not determine。
小小的借鉴了一下题解。。。被组里的人骂了,crying。。。
细节来说:小孩是从0开始编号的。
code:
题目大意:(剪子包袱锤~~)不过,多了个美丽的judge,可以随便出任何种手势。判断能否根据已知的游戏的结果选出judge。。。
思路:基本用食物链。。。不过。。。多了个美丽的judge,就困难了些。。。提高到了baidustart的难度(06年~~)。
枚举每个小孩为judge,判断他为judge时在第几句话出错falt[i](即到第几句话能判断该小孩不是judge)。
1. 如果只有1个小孩是judge时全部语句都是正确的,说明该小孩是judge,那么判断的句子数即为其他小孩的falt[i]的最大值。如果
2. 如果每个小孩的都不是judge(即都可以找到出错的语句),那么就是impossible。
3. 多于1个小孩是judge时没有找到出错的语句,就是Can not determine。
小小的借鉴了一下题解。。。被组里的人骂了,crying。。。
细节来说:小孩是从0开始编号的。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct use{
int a1,a2,kind;
}a[2001];
int fa[1501]={0},b[501]={0};
char ch[100];
int rool(int x)
{
if (fa[x]!=x) fa[x]=rool(fa[x]);
return fa[x];
}
int main()
{
int i,j,r1,r2,n,m,ci,ans,l,ansn,judge,aa,bb,maxn;
bool f;
while (scanf("%d%d",&n,&m)==2)
{
if (m==0)
printf("Player 0 can be determined to be the judge after 0 lines\n");
else
{
ans=0;
memset(b,0,sizeof(b));
memset(a,0,sizeof(a));
for (i=1;i<=3*n;++i)
fa[i]=i;
for (i=1;i<=m;++i)
{
scanf("%s",&ch);
l=strlen(ch);
j=0;
while (ch[j]>=‘0‘&&ch[j]<=‘9‘)
{
a[i].a1=a[i].a1*10+ch[j]-‘0‘;
++j;
}
++a[i].a1;
if (ch[j]==‘=‘) a[i].kind=0;
if (ch[j]==‘>‘) a[i].kind=1;
if (ch[j]==‘<‘) a[i].kind=-1;
++j;
while (ch[j]>=‘0‘&&ch[j]<=‘9‘&&j<l)
{
a[i].a2=a[i].a2*10+ch[j]-‘0‘;
++j;
}
++a[i].a2;
}
for (judge=1;judge<=n;++judge)
{
f=false;
for (i=1;i<=3*n;++i)
fa[i]=i;
for (i=1;i<=m;++i)
{
if (a[i].a1==judge||a[i].a2==judge) continue;
if (a[i].kind==0)
{
aa=a[i].a1;
bb=a[i].a2;
if (rool(aa+n)==rool(bb)||rool(aa+2*n)==rool(bb))
{
b[judge]=i;
f=true;
break;
}
r1=rool(aa);
r2=rool(bb);
if (r1!=r2)
{
fa[r1]=r2;
fa[rool(aa+n)]=rool(bb+n);
fa[rool(aa+2*n)]=rool(bb+2*n);
}
}
else
{
if (a[i].kind==1)
{
aa=a[i].a1;
bb=a[i].a2;
}
else
{
aa=a[i].a2;
bb=a[i].a1;
}
if (rool(aa)==rool(bb)||rool(aa+2*n)==rool(bb))
{
b[judge]=i;
f=true;
break;
}
fa[rool(aa+n)]=rool(bb);
fa[rool(aa+2*n)]=rool(bb+n);
fa[rool(aa)]=rool(bb+2*n);
}
}
if (!f)
{
++ans;
ansn=judge;
}
}
if (ans>1) printf("Can not determine\n");
if (ans==0) printf("Impossible\n");
if (ans==1)
{
maxn=0;
for (i=1;i<=n;++i)
if (b[i]>maxn) maxn=b[i];
printf("Player %d can be determined to be the judge after %d lines\n",ansn-1,maxn);
}
}
}
}
POJ2912 Rochambeau (hard?or!hard?)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。