poj Counterfeit Dollar假币错解

来源:互联网 发布:和彩云管家 网络异常 编辑:程序博客网 时间:2024/06/05 05:41

做的是poj上的1013题,就是在十二枚钱币里有一枚假币,通过三次称量找出其中唯一的一枚假币,保证第三次一定能找出那枚假币,假币由A-L进行编号,三次称量的假币由输入给出,例如ABCD EFGH UP,表达的意思是称左边放ABCD四枚硬币,右边放EFGH四枚硬币,UP表示称两边不平衡且右边高于左边,也即右边重量轻于左边

我的思路是,读入一整行输入,用一个String类型的str[ ]数组来存储输入的三个部分 即左边 右边 和结果,再用一个int类型的arr[ ] 数组储存每枚硬币的假币怀疑程度,如果str[2]中是“EVEN”,则表示该次称量左右两边相等,称量的所有硬币都是真币,那就把这些真币对应的字母加到ArrayList的链表中,将真币对应位置的arr[ ]数组值置为0,当str[2]中是“UP”时,轮流逐个检测str[0]和str[1],首先看这链表中有没有存储该字母,若有,则不作处理,若没有,则哪边重了,就在那方的字母对应的str[ ]数字进行++;如果轻了就--。最后完成三个输入之后,看str[ ]的哪个位置具有最大的绝对值,就把那个字母输出来。

代码附上:

package poj_online;import java.util.ArrayList;import java.util.Scanner;public class Weight {public static void main(String args[]){Scanner scan=new Scanner(System.in);int n=Integer.parseInt(scan.nextLine());for(int i=0;i<n;i++){int []arr=new int[12];  //记录每个硬币的假币程度ArrayList<Character> al=new ArrayList<Character>();  //存储每一个真币for(int j=0;j<3;j++){String []str=scan.nextLine().split(" ");//左边重右边轻if(str[2].equals("UP")){for(int k=0;k<str[0].length();k++){if(!al.contains(str[0].charAt(k)))arr[str[0].charAt(k)-'A']++;}for(int k=0;k<str[1].length();k++){if(!al.contains(str[1].charAt(k)))arr[str[1].charAt(k)-'A']--;}}else if(str[2].equals("DOWN")){//左边轻右边重for(int k=0;k<str[0].length();k++){if(!al.contains(str[0].charAt(k)))arr[str[0].charAt(k)-'A']--;}for(int k=0;k<str[1].length();k++){if(!al.contains(str[1].charAt(k)))arr[str[1].charAt(k)-'A']++;}}else{for(int k=0;k<str[0].length();k++){if(!al.contains(str[0].charAt(k))){al.add(str[0].charAt(k));arr[str[0].charAt(k)-'A']=0;}}for(int k=0;k<str[1].length();k++){if(!al.contains(str[1].charAt(k))){al.add(str[1].charAt(k));arr[str[1].charAt(k)-'A']=0;}}}}int max=0,index=0;String line=null;for(int j=0;j<12;j++){if(max<Math.abs(arr[j]))index=j;}if(arr[index]<0)line="light.";elseline="heavy.";System.out.println((char)(index+'A')+" is the counterfeit coin and it is "+line);}}}

测试用例通过了,最后提交表示wrong answer,无解,求大神告知

原创粉丝点击