题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16424
题意 :
有12个硬币 有一个是假的 比其他的或轻或重 分别标记为A到L
然后输入cas 有个cas组数据
每组输入3行 每行3个字符串 第一个表示当时天平上左边有哪几个字符 第二个是右边 2边个数一样 但是不一定有几个
之后第三个字符串描述左边是比右边大小还是相等
问你 哪一个硬币是假的 假的相对于真的是清还是重 (假硬币有轻有重,只有一枚是假硬币)
保证有解
"up":右轻
<pre name="code" class="plain">"down":右重
"even":一样重
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int v[15],cot[15]; int fun(int x) { if(x<0) return -x; return x; } int main() { int i,j,t; char a[15],b[15],c[5]; scanf("%d",&t); while(t--) { memset(v,0,sizeof(v)); memset(cot,0,sizeof(cot)); for(i=0;i<3;i++) { scanf("%s%s%s",a,b,c); if(strcmp(c,"up")==0) {//右轻 for(j=0;j<strlen(a);j++) { cot[a[j]-'A']++; cot[b[j]-'A']--; } } else if(strcmp(c,"down")==0) {//右重 for(j=0;j<strlen(a);j++) { cot[a[j]-'A']--; cot[b[j]-'A']++; } } else { for(j=0;j<strlen(a);j++) { v[a[j]-'A']=1; v[b[j]-'A']=1; } } } int m=-1,ans,f; for(i=0;i<12;i++) { if(!v[i]) { if(m<fun(cot[i])) { m=fun(cot[i]); ans=i; f=cot[i]; } } } if(f>0) printf("%c is the counterfeit coin and it is heavy.\n",ans+'A'); else printf("%c is the counterfeit coin and it is light.\n",ans+'A'); } return 0; }
时间: 2024-10-18 04:59:44