瞎搞poj1013

来源:互联网 发布:行知教育集团 编辑:程序博客网 时间:2024/06/10 15:54

瞎搞poj1013

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');elseprintf("%c is the counterfeit coin and it is light. \n",to+'A');}return 0;}


原创粉丝点击