1. 程式人生 > >瞎搞poj1013

瞎搞poj1013

-- 可能 poj light stdio.h c代碼 sizeof 其它 printf

http://poj.org/problem?id=1013

題意:給你標記從A到L的石子,其中有一個石子,可能會輕於其它石子,也可能重於其它石子。你只能通過三次天平的測量去找到這個石子。天平的三個狀態,even 兩邊一樣重 up左重右輕 down左輕右重

思路:標記even狀態的所有石子,再用一個計數器去記錄up和down的石子的出現次數重就加1,輕就減1。(超重或超輕的石子只會有一種狀態要麽+要麽-,其它的石子會因為這個石子的影響有兩個狀態所以允許+-的抵銷)最後你只需要找出出現次數最大的一個石子,如果此時個數為負數那就是light,為正就是heavy

AC代碼:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
char a[15],b[15],c[15];
int vis[15];
memset(vis,0,sizeof(vis));
int d[15];
memset(d,0,sizeof(d));
for(int i=0; i<3; i++)
{
scanf("%s %s %s",a,b,c);
if(c[0]==‘e‘)
{
for(int j=0; a[j]; j++)
vis[a[j]-‘A‘]=1;
for(int j=0; b[j]; j++)
vis[b[j]-‘A‘]=1;
}
else if (c[0]==‘d‘)
{
for(int j=0; b[j]; j++)
d[b[j]-‘A‘]++;
for(int j=0; a[j]; j++)
d[a[j]-‘A‘]--;
}
else
{
for(int j=0; a[j]; j++)
d[a[j]-‘A‘]++;
for(int j=0; b[j]; j++)
d[b[j]-‘A‘]--;
}
}
int maxn=0;
int to=-1;
for(int i=0;i<12;i++)
{
if(vis[i])
continue;
if(maxn<=abs(d[i]))
{
maxn=abs(d[i]);
to=i;
}
}
if(d[to]>0)
printf("%c is the counterfeit coin and it is heavy. \n",to+‘A‘);
else
printf("%c is the counterfeit coin and it is light. \n",to+‘A‘);
}
return 0;
}

瞎搞poj1013