poj 杂题 - 1013 Counterfeit Dollar

判断硬币题。这道题目没咋知道怎么做,看了其他人的discuss才有了思路。

一,EVEN时,两边都是真币

二,非EVEN时,没上天平的都是真币

三,曾经被认为可能偏重,又出现在偏轻的一方的是真币。

我们可以用一个数组zeros存储一定是真币,即出现在even情况内的那些;另一个数组sus存储对可能是假币的怀疑情况,当出现在up时,左边的硬币sus--,右边的++。down时反过来,这样我们通过判断正负就能判断这个假币是light还是heavy,而被认为可能偏重,又出现在偏轻的一方sus自然会先++,后--恢复成0.

#include<stdio.h>
#include<string.h>

#define abs(x)( x>=0 ? x :-x)
#define max(x,y)(x>y?x:y)
int sus[13];
int zeros[13];
int main(){
	int t,i,j;
	scanf("%d",&t);
	while(t--){
		char left[3][6],right[3][6],status[3][6];
		memset(sus,0,sizeof(sus));
		memset(zeros,0,sizeof(zeros));
		for(i=0;i<3;i++){
			scanf("%s %s %s",left[i],right[i],status[i]);
		}
		for(i=0;i<3;i++){
			if(strcmp(status[i],"even")==0){
				for(j=0;j<strlen(left[i]);j++){
					zeros[left[i][j]-65] = 1;
					zeros[right[i][j]-65] = 1;
				}
			}
		}
		for(i=0;i<3;i++){
				if(strcmp(status[i],"up")==0){
					for(j=0;j<strlen(left[i]);j++){
							sus[left[i][j]-65]--;
							sus[right[i][j]-65]++;
					}
				}
				else if(strcmp(status[i],"down")==0){
					for(j=0;j<strlen(left[i]);j++){
							sus[right[i][j]-65]--;
							sus[left[i][j]-65]++;
					}
				}
		}
		int m =0,maxval = 0;
		for(i=0;i<13;i++){
			if(abs(sus[i])>=maxval && zeros[i]!=1) {
				maxval = abs(sus[i]);
				m=i;
			}
		}
		if(sus[m]>0) printf("%c is the counterfeit coin and it is light.\n",m+65);
		else printf("%c is the counterfeit coin and it is heavy.\n",m+65);
	}
	return 0;
}
时间: 2024-10-12 15:28:07

poj 杂题 - 1013 Counterfeit Dollar的相关文章

poj 杂题 - 2081 Recaman&#39;s Sequence

这道题目一开始就能知道考点在如何缩短查找时间.所以加快查找是我们的重点.但是在大数据面前,查找算法都不够快,所以我们用简单的hash思想来做. 我们开一个数组a,当出现了一个数b时,把该数作为下标调整值,即a[b] = -1,下一次出现该值的时候直接去找这个值作为下标的a值是否为-1即可. #include<stdio.h> #include<string.h> #define MAX 5000010 int p[MAX]={0}; int s[MAX]={0}; int main

poj 杂题 - 1959 Darts

这一题放在杂题里,是因为我没有用DP,而是使用的枚举,当然是受到了discuss里面的启发. 因为我们只能有三次机会,每一次只可以是固定的63个数,所以枚举感觉更加直观,但是不知道是不是没有DP快. #include<stdio.h> #include<string.h> int n; int Darts[63]; int main(){ int t,c=1,i,j,k,res; scanf("%d",&t); for(i = 0 ;i<=20;i

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>

poj 杂题 - 2231 Moo Volume

一开始以为是long long输入,后来发现用int就行,,,反正也是一个挺简单的题目,直接贴代码了. #include<stdio.h> #include<math.h> int cows[10005]={0}; int main(){ int n,i,j; long long res = 0,temp; scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&cows[i]);

poj 杂题 - 1083 Moving Tables

这道题最主要的是看懂题目即可.我们需要算出搬动桌子的最短时间,根据这个图可以知道不同房间占用同一走廊. 这道题里1-4,2 -3显然占用同一走廊,但是2-3 和 4-5也占用了房间4和房间3的那个走廊,所以注意这个数据的最短时间是20,不是10.搞清楚这个就好做了,我们可以将房间偶数/2,奇数/2+1,这样2-3变成了1-2,4-5变成了2-3,自然占用了走廊. #include<stdio.h> #include<string.h> #define max(x,y)(x>y

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

POJ - Counterfeit Dollar 题解

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

POJ刷题

这篇文章会持续更新, 记录我所有AC的POJ题目. PS:我所有的POJ代码都存在我的github上. 1000 A+B 水题不说. 1001 Exponentiation 求一个数的n次方,用高精度,注意细节. 1002 487-3279 题目描述:设计程序,按照功能机上的9键键位把字母电话号码转化成数字电话号码,并将电话号码格式化(原本的电话号码格式里可能出现无数个短横线-(=_=#)) 对于给定输入,输出有重复的电话号码,并给出重复的次数. 输入格式:第一行一整数n,表示电话号码的数量,接