Java-POJ1013-Counterfeit Dollar

Posted Jason-Cow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于Java-POJ1013-Counterfeit Dollar的主要内容,如果未能解决你的问题,请参考以下文章

Java-POJ1003-Hangover

Java-POJ1012-Joseph

Java-POJ1004-Financial Management

Java-POJ1008-Maya Calendar

Java-POJ1001-求高精度幂

Java-POJ1006-Biorhythms(中国剩余定理)