您的位置:首页 > Web前端

Counterfeit Dollar POJ - 1013

2017-01-25 10:51 344 查看
首先请允许我骂一顿杀千刀的hoj( g20)
,我找点题目容易么。

 然后,欢迎大家逃离大帅的世界,这儿的题目容易得很。
  题目来咯:
  思远宝宝有一打银币( 一打有几个你知道么)。然而,其中有一个是伪造的(不知道是偏重还是偏轻),现在思远有三次机会进行天平称重,并且保证三次后有解,请你找出伪造银币并告诉我是偏重还是偏轻。

Input
 
第一行n(n>0)代表有几个样例。每个样例都包括三行输入。我们把一打银币映射到大写字母A--L。每一行包括三个string,
表示左盘,右盘和右盘的平衡状况(up,down,even) 。放入左盘和右盘的银币一定一样多。

Output
对于每个样例,我们保证有解,请输出哪个硬币是伪造的并且输出偏重还是偏轻(light heavy)。
Sample Input
1
EFGH ABCD even
EFGI ABCI  even
ABEF CDFK up

Sample Output
K is the counterfeit coin and it is light.


因为只有一个假币,所以当重量为even时,只有左右不存在相同那么这个字符就是真的,用一个数组来标记,当他是up或者dow时,则被列入怀疑行列,怀疑次数越多,是假币的可能性越大

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

int main()
{
int n,len;
int book[12]={0},flag[4][12];//分别表示被怀疑的次数和是否一定为假币
char l[3][10],r[3][10],tmp[5];
scanf("%d",&n);
getchar();
while(n--)
{
memset(flag,0,sizeof(flag));
memset(book,0,sizeof(book));//务必记得初始化
for(int i=0;i<3;i++)
{
scanf("%s%s%s",l[i],r[i],tmp);//字符串是以空格或回车结尾的
len=strlen(l[i]);
if(strcmp(tmp,"even")==0)
{
for(int j=0;j<len;j++)
{
flag[i][l[i][j]-'A']=1;
}
for(int j=0;j<len;j++)
{
if(flag[i][r[i][j]-'A']==1)//避免左右相同带来的影响
flag[i][r[i][j]-'A']=0;
else
flag[i][r[i][j]-'A']=1;
}
}
if(strcmp(tmp,"up")==0)
{
for(int j=0;j<len;j++)
{
book[l[i][j]-'A']++;
book[r[i][j]-'A']--;
}
}
if(strcmp(tmp,"down")==0)
{
for(int j=0;j<len;j++)
{
book[l[i][j]-'A']--;
book[r[i][j]-'A']++;
}
}
}
for(int i=0;i<12;i++)
{
flag[3][i]=flag[0][i]||flag[1][i]||flag[2][i];
}
int maxx=-1,j=0;
for(int i=0;i<12;i++)
{
if(flag[3][i]==1)
continue;
if(abs(book[i])>=maxx)
{
maxx=abs(book[i]);
j=i;
}
}
if(book[j]>0)
{
printf("%c is the counterfeit coin and it is heavy.\n",'A'+j);
}
else
{
printf("%c is the counterfeit coin and it is light.\n",'A'+j);
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  策略问题