PKU ACM-1013题 java Counterfeit Dollar

终于AC了,原来我一直以为输入是四个字符,四个字符输入的,晕!不过后来还是就解决了哈哈!好了,开始说正题吧!

题意:有12个硬币,其中有一个和其他的硬币重量不一样,然后小X用3次天平称称量这些硬币。输入3组数据样式是“字符字符 字符字符 even|up|down”字符个数不定!!在网上看到过计算在天平不平衡的时候字符出现的次数多少来判断的算法,这里我用了其他的算法,虽然有点麻烦但是效果还是好的。我的做法是,先弄两个数组其中一个是A--L的标识符,如果是1则说明它被确认位真硬币,其他数字则有可能是假币,还有一个数组时字符串数组,来表示如果一个字母在不平衡称量那次里面出现时,并且不能确认他是真的硬币的时候,那么设定一个假设它就是假硬币的时候的light|heavy(有可能是真币,但是这不影响结果,因为真币是不输出的 :) )。我们来演示一次输入吧。就题目上的例子好了
输入: 1 //在这里caseNum的输入不讲。
ABCD EFGH even
ABCI EFJK up
ABIJ EFGH even
1.对A--L 12个字母都标记为0进行初始化。
2.输入第一行ABCD EFGH even 先进行第三个字符串的even|up|down的辨别因为是even所以在这里出现的字符全标记为1。则:
A B C D E F G H I J K L
1 1 1 1 1 1 1 1 0 0 0 0
3.输入第二行ABCI EFJK up 不是even所以这里有的字母除去原本标识符是1的标识符变为2即。并且最后没出现的字符也标识为1。并且记录相应的light|heavy
A B C D E F G H I J K L
1 1 1 1 1 1 1 1 2 2 2 1
4.输入第三行ABIJ EFGH even 在这里出现的字符全部标识为1.
A B C D E F G H I J K L
1 1 1 1 1 1 1 1 1 1 2 1

最后得出K的值不一样,输出结果。注意:如果一个字符在两次不平衡中的light|heavy不一样,那么也需要将其标识为1.因为一个硬币不可能即为轻又为重。以下是全部代码:
import java.util.Scanner; public class Main{ public static void main(String[] args)throws Exception{ Scanner cin=new Scanner(System.in); int caseNum=cin.nextInt(); cin.nextLine(); while(cin.hasNext()){ int num=0,ToT=1; int[] letters={0,0,0,0,0,0,0,0,0,0,0,0}; String[] lettersLH={"null","null","null","null","null","null","null","null","null","null","null","null"}; while(cin.hasNext()){ String a=cin.nextLine(); String[] aa=a.split(" "); if(aa[2].equals("even")){ for(int i=0;i<aa[0].length();i++){ letters[((int)aa[0].charAt(i)-65)]=1; } for(int i=0;i<aa[0].length();i++){ letters[((int)aa[1].charAt(i)-65)]=1; } }else if(aa[2].equals("up") || aa[2].equals("down")){ ToT=ToT+1; for(int i=0;i<aa[0].length();i++){ if(letters[((int)aa[0].charAt(i)-65)]!=1){ String temp=aa[2].equals("up")? "heavy" : "light"; String temp2=aa[2].equals("up")? "light" : "heavy"; if(lettersLH[((int)aa[0].charAt(i)-65)]==temp2)continue; lettersLH[((int)aa[0].charAt(i)-65)]=temp; letters[((int)aa[0].charAt(i)-65)]=ToT; } } for(int i=0;i<aa[1].length();i++){ if(letters[((int)aa[1].charAt(i)-65)]!=1){ String temp=aa[2].equals("up")? "heavy" : "light"; String temp2=aa[2].equals("up")? "light" : "heavy"; if(lettersLH[((int)aa[1].charAt(i)-65)]==temp)continue; lettersLH[((int)aa[1].charAt(i)-65)]=temp2; letters[((int)aa[1].charAt(i)-65)]=ToT; } } for(int i=0;i<12;i++){ if(letters[i]!=ToT && letters[i]!=1)letters[i]=1; } } num++; if(num==3){ num=0; break; } } for(int i=0;i<12;i++){ if(letters[i]!=1){ System.out.println((char)(i+65)+" is the counterfeit coin and it is "+lettersLH[i]+"."); break; } } } } }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值