zoj 1184

时间:2022-02-18 20:54:14

硬币称重,经典,1.若被判平,左右所有硬币必正常;2.若判轻或判重,对应硬币被判轻-1、重记数+1;3.只有球只被判轻或判重,且次数跟天平不平衡次数相等,该球才能是坏的,否则必然是好的。且>0的是偏重,<0是偏轻.

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main(void)
{
int s[];
int i,j,t,len1,len2,count=;
char str[][][];
scanf("%d",&t);
while(t--)
{
count=;/*不平衡的次数*/
for(i=;i< ;i++ )
scanf("%s%s%s",str[i][],str[i][],str[i][]);
memset(s,,sizeof(s));
for(i=;i<;i++)/*找到所有相等的 */
{
if(strcmp(str[i][],"even")==)
{
len1=strlen(str[i][]);
for(j=;j<len1;j++)
s[(str[i][][j]-'A')]=;/*赋值1000表示正常*/
len2=strlen(str[i][]);
for(j=;j<len2;j++)
s[(str[i][][j]-'A')]=;
}
}
for(i=;i<;i++)
{
if(strcmp(str[i][],"up")==)
{
count++; len1=strlen(str[i][]);/*up说明左边重 */
for(j=;j<len1;j++)
{
if(s[(str[i][][j]-'A')]!=)
s[(str[i][][j]-'A')]++;
}
len2=strlen(str[i][]);/*右边比较小 */
for(j=;j<len2;j++)
{
if(s[(str[i][][j]-'A')]!=)
{
s[(str[i][][j]-'A')]--;
} }
}
}
for(i=;i<;i++)
{
if(strcmp(str[i][],"down")==)
{
count++; len1=strlen(str[i][]);/*down说明左边小 */
for(j=;j<len1;j++)
{
if(s[(str[i][][j]-'A')]!=)
{
s[(str[i][][j]-'A')]--;
} }
len2=strlen(str[i][]);/*右边左边都正常 */
for(j=;j<len2;j++)
{
if(s[(str[i][][j]-'A')]!=)
{
s[(str[i][][j]-'A')]++;
}
} }
}
for(i=;i<;i++)
{
if(abs(s[i])==count)/*当不平衡的次数和硬币的问题次数相等时,那么该硬币就是问题硬币*/
{
printf("%c is the counterfeit coin and ",i+'A');
printf( s[i]<? "it is light.\n":"it is heavy.\n");
break;
}
}
} return ;
}
/*
自己例举的测试实例
2
ABCD EFGH down
CDEF GHLK even
AEFD JKCD down
B A down
B C even
D F even
*/