UVa 608 - Counterfeit Dollar

題目:給你12個硬幣編號A-L,有一個和其他的重量不一樣,現在取某些硬幣放到天平兩端;

給你3中不同的測試結果,為哪個是特殊的硬幣是輕了還是重了(一定有唯一解)。

分析:暴力、枚舉。數據較小直接枚舉24中可能性,判斷條件是否成立即可。

說明:最近做題很少啊╮(╯▽╰)╭。

#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>

using namespace std;

int  coins[12];
char str_a[3][13],str_b[3][13],str_c[3][13];

int state(char s[])
{
	if (!strcmp(s, "even")) return 0;
	if (!strcmp(s, "up"))   return 1;
	if (!strcmp(s, "down")) return -1;
	return -2;
}

int compare(char a[], char b[])
{
	int value_a = 0,value_b = 0;
	for (int i = 0; a[i]; ++ i)
		value_a += coins[a[i]-'A'];
	for (int i = 0; b[i]; ++ i)
		value_b += coins[b[i]-'A'];
	return value_a-value_b;
}

int main()
{
	int n,s;
	while (~scanf("%d",&n))
	while (n --) {
		for (int i = 0; i < 3; ++ i)
			scanf("%s %s %s",str_a[i],str_b[i],str_c[i]);

		for (int p = 0; p < 12; ++ p)
		for (int q = 0; q <= 1; ++ q) {
			for (int i = 0; i < 12; ++ i)
				coins[i] = 0;
			if (q == 1) {
				coins[p] = -1;
			}else coins[p] = 1;

			int flag = 1;
			for (int i = 0; i < 3; ++ i) {
				if (compare(str_a[i], str_b[i]) != state(str_c[i])) {
					flag = 0;
					break;
				}
			}
			if (flag) {
				for (int i = 0; i < 12; ++ i) {
					if (coins[i] == -1 || coins[i] == 1) {
						printf("%c is the counterfeit coin and it is ",'A'+i);
						if (coins[i] < 0) {
							printf("light.\n");
						}else printf("heavy.\n");
						break;
					}
				}
			}
		}
	}
    return 0;
}
时间: 2024-10-18 04:59:48

UVa 608 - Counterfeit Dollar的相关文章

POJ - Counterfeit Dollar 题解

挺考智力的题目. 思路: 1 如果是假币,那么每次都必定引起天平的不平衡 2 如果天平平横,那么全部都肯定是真币 利用这个特性,利用hash表,就能写出很简洁的程序. 如果使用枚举,那么会(轻松?)过百行的代码的. 当然其实题目给出了条件:一定可以找出唯一的假币的. 如果没有这个条件,那么是不一定可以三次称,就能确定结果的. 下面程序参考了别人的: http://www.cnblogs.com/orangeman/archive/2009/07/10/1520663.html 这个家伙的思路也不

POJ 1013:Counterfeit Dollar

Counterfeit Dollar Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 42028   Accepted: 13369 Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are true silver dollars; one coin is counterfeit ev

D - Counterfeit Dollar(第二季水)

Description Sally Jones has a dozen Voyageur silver dollars. However, only eleven of the coins are true silver dollars; one coin is counterfeit even though its color and size make it indistinguishable from the real silver dollars. The counterfeit coi

九度[1150]Counterfeit Dollar

# include<iostream> # include<string> # include<cstdio> using namespace std; struct node{ string a; string b; }s[3]; int main() { string a[3]; int n=0; bool heavy; char c; //freopen("in.txt","r",stdin); cin>>n;

poj 杂题 - 1013 Counterfeit Dollar

判断硬币题.这道题目没咋知道怎么做,看了其他人的discuss才有了思路. 一,EVEN时,两边都是真币 二,非EVEN时,没上天平的都是真币 三,曾经被认为可能偏重,又出现在偏轻的一方的是真币. 我们可以用一个数组zeros存储一定是真币,即出现在even情况内的那些:另一个数组sus存储对可能是假币的怀疑情况,当出现在up时,左边的硬币sus--,右边的++.down时反过来,这样我们通过判断正负就能判断这个假币是light还是heavy,而被认为可能偏重,又出现在偏轻的一方sus自然会先+

Counterfeit Dollar

题目:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=16424 题意 : 有12个硬币 有一个是假的 比其他的或轻或重     分别标记为A到L 然后输入cas 有个cas组数据 每组输入3行 每行3个字符串 第一个表示当时天平上左边有哪几个字符  第二个是右边 2边个数一样 但是不一定有几个 之后第三个字符串描述左边是比右边大小还是相等 问你  哪一个硬币是假的  假的相对于真的是清还是重  (假硬币有轻有重,只有一枚是

POJ 1013 Counterfeit Dollar

每次做这个题都会wa……TAT 题意:一共12枚硬币,有1个是假的,假的硬币重量跟别的不一样,用一杆天平量三次,给出每次量的方案和结果,问哪个是假币,是重还是轻. 解法:如果天平两端相等说明这两端的硬币都是真币,用一个数组记录真币,如果天平不平衡,用一个新数组初始化是0,重的硬币+1,轻的硬币-1,最后统计一下哪个硬币不确定是真币而且重量的绝对值最大. 代码: #include<stdio.h> #include<iostream> #include<algorithm>

1013 Counterfeit Dollar

思路:结果"even"者均为正确硬币.则用数组flag[]进行标记,后面再次遇到该枚硬币则自动忽略. 处理错误硬币:我们遇到结果"up"除已判断正确的硬币外,左面硬币flag[]值-1.右面硬币flag值+1.遇到结果"down"因左面差异硬币整体较轻则-1,右面+1 结果处理:abs值最大者为错误硬币. #include<iostream> #include<string.h> #include<cstdio>

ACM训练方案-POJ题目分类

ACM训练方案-POJ题目分类 博客分类: 算法 ACM online Judge 中国: 浙江大学(ZJU):http://acm.zju.edu.cn/ 北京大学(PKU):http://acm.pku.edu.cn/JudgeOnline/ 杭州电子科技大学(HDU):http://acm.hdu.edu.cn/ 中国科技大学(USTC):http://acm.ustc.edu.cn/ 北京航天航空大学(BUAA)http://acm.buaa.edu.cn/oj/index.php 南京