【poj1013】 Counterfeit Dollar

http://poj.org/problem?id=1013 (题目链接)

题意

  12个硬币中有1个是假的,给出3次称重结果,判断哪个硬币是假币,并且判断假币是比真币中还是比真币轻。

Solution

  很久以前写的题了,现在翻了翻发现思路还是不错的。

  http://blog.csdn.net/lyy289065406/article/details/6661421

细节

  像这种比较水的与字符串相关的题目用string做一些处理会方便很多,然而这道题好像都差不多。

代码

// poj1013
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<cmath>
#include<string>
#define MOD 1000000007
#define inf 2147483640
#define LL long long
#define free(a) freopen(a".in","r",stdin);freopen(a".out","w",stdout);
using namespace std;
inline LL getint() {
    LL x=0,f=1;char ch=getchar();
    while (ch>'9' || ch<'0') {if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0' && ch<='9') {x=x*10+ch-'0';ch=getchar();}
    return x*f;
}

int a[12];
string s1,s2,s3;

int main() {
	int T;
	scanf("%d",&T);
	while (T--) {
		int cnt=0;
		for (int i=0;i<12;i++) a[i]=0;
		for (int o=1;o<=3;o++) {
			cin>>s1>>s2>>s3;
			if (s3=="up") {
				for (int j=0;j<(int)s1.size();j++) a[s1[j]-'A']++;
				for (int j=0;j<(int)s2.size();j++) a[s2[j]-'A']--;
				cnt++;
			}
			if (s3=="down") {
				for (int j=0;j<(int)s1.size();j++) a[s1[j]-'A']--;
				for (int j=0;j<(int)s2.size();j++) a[s2[j]-'A']++;
				cnt++;
			}
			if (s3=="even")
				for (int j=0;j<(int)s1.size();j++) a[s1[j]-'A']=a[s2[j]-'A']=6;
		}
		for (int i=0;i<12;i++) {
			if (a[i]==cnt) printf("%c is the counterfeit coin and it is heavy.\n",i+'A');
			if (a[i]==-cnt) printf("%c is the counterfeit coin and it is light.\n",i+'A');
		}
	}
    return 0;
}

  

posted @ 2016-10-18 19:26  MashiroSky  阅读(184)  评论(0编辑  收藏  举报