Java-POJ1013-Counterfeit Dollar

在13枚硬币中找出fake的那一个

输入:三次天平称量结果

 1 package poj.ProblemSet;
 2
 3 import java.util.Scanner;
 4
 5 /*
 6 我怎么觉得是贪心算法呢?
 7 起初对所有硬币标记0;
 8 如果是even,则两边所有的硬币记为真(记233);
 9 否则就对不确定的硬币记录怀疑(++或者--根据天平倾斜方向);
10 最后只要看哪个硬币的绝对值最大,也就是被怀疑的次数最多,即是假币。
11  */
12 public class poj1013 {
13     public static int[] value = new int[20];
14     public static String[] a = new String[5];
15     public static String[] b = new String[5];
16     public static String[] c = new String[5];
17     public static final int REAL = 233;
18
19     public static void work(int r, int len, int type) {
20         if (type == 1) {
21             for (int i = 0; i < len; i++) {
22                 if (value[a[r].charAt(i)-‘A‘+1] != REAL) value[a[r].charAt(i)-‘A‘+1]++;
23                 if (value[b[r].charAt(i)-‘A‘+1] != REAL) value[b[r].charAt(i)-‘A‘+1]--;
24             }
25         }
26         else if (type == 2) {
27             for (int i = 0; i < len; i++) {
28                 if (value[a[r].charAt(i)-‘A‘+1] != REAL) value[a[r].charAt(i)-‘A‘+1]--;
29                 if (value[b[r].charAt(i)-‘A‘+1] != REAL) value[b[r].charAt(i)-‘A‘+1]++;
30             }
31         }
32         else /*if (type == 3)*/ {
33             for (int i = 0; i < len; i++) {
34                 value[a[r].charAt(i)-‘A‘+1] = REAL;
35                 value[b[r].charAt(i)-‘A‘+1] = REAL;
36             }
37         }
38
39     }
40
41     public static void main(String[] args) {
42         Scanner cin = new Scanner(System.in);
43         for (int n = cin.nextInt(); n-- > 0; ) {
44             for (int i = 1; i < 20; i++) value[i] = 0;
45             for (int r = 1; r <= 3; r++) {
46                 a[r] = cin.next();b[r] = cin.next();c[r] = cin.next();int len = a[r].length();
47                 if (c[r].equals("up")) work(r, len, 1);
48                 else if (c[r].equals("down")) work(r, len, 2);
49                 else /*if (c[r].equals("even"))*/ work(r, len, 3);
50             }
51             int max = 0,id = 0;
52             for (int i = 1; i <= 13; i++) {
53                 int val = Math.abs(value[i]);
54                 if (value[i] != REAL && val > max) { max = val;id = i; }
55             }
56             System.out.println((char)(id-1+‘A‘) + " is the counterfeit coin and it is " + (value[id]>0?"heavy":"light") + ".");
57         }
58     }
59 }

原文地址:https://www.cnblogs.com/JasonCow/p/12245192.html

时间: 2024-10-17 14:40:01

Java-POJ1013-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>

UVa 608 - Counterfeit Dollar

題目:給你12個硬幣編號A-L,有一個和其他的重量不一樣,現在取某些硬幣放到天平兩端: 給你3中不同的測試結果,為哪個是特殊的硬幣是輕了還是重了(一定有唯一解). 分析:暴力.枚舉.數據較小直接枚舉24中可能性,判斷條件是否成立即可. 說明:最近做題很少啊╮(╯▽╰)╭. #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std;

1013 Counterfeit Dollar

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

POJ1013称硬币【枚举】

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