练习题 | 假币问题

时间:2023-02-12 21:06:07

题名  假币问题

练习题 | 假币问题

 

分析 

解题思路

一共12枚银币,先都看作真币,再枚举,每次设其中一枚为假币(0代表真币,-1代表轻假币,1代表重假币(用数值表示方便后面计算重量));

每组测试用例会有三个条件,按条件称量天平左右两边各自的重量,最后判断是否跟条件结果一致,若三条件都满足,则此时设置的假币成立,输出。

数据结构

  • 一个长度为12的int类型数组,用于标记12枚银币的真假状态;
  • 将测试用例的条件输入
    • 两个3行6列的char类型数组,分别存储三个条件称量时左右两边放的银币;(6列的原因:12枚银币,每边最多放6枚)
    • 一个String类型数组,存储条件中的平衡结果;
  • pdWeight方法——判断假设的假币是否满足三个条件(返回boolean类型)
    • 计算重量,分别存入leftW和rightW;
    • 比较计算结果,如果有一个不符合条件中的平衡结果,则返回false;
    • 若三个条件都符合,则返回true;
  • Main
    • for循环12次,每次设一枚银币为假,一旦pdWeight方法返回true,则跳出循环,输出结果。( 每次进入下一循环前,记得将上次设置的假币还原为真币)

 

代码如下 

 1 import java.io.*;
 2 public class Main {
 3     static int []status=new int [12];//储存每一枚硬币的真假状态,0真币,-1轻假币,1重假币
 4     static char left[][]=new char[3][6],right[][]=new char[3][6];
 5     static String result[]=new String[3];
 6        //存贮天平两边的硬币编号(每边最多6个硬币),以及条件中的平衡状态(”up”,”down”或 ”even”分别表示右端高、右端低和平衡)
 7     
 8     static boolean pdWeight(){
 9         int leftW=0,rightW=0;
10         for(int i=0;i<3;i++){
11             //[注意]下面判断条件不能写j<6(main中赋值改变了数组长度);别忘记去除掉空值(否则‘0’-‘A’的数组下标会报错)
12             for(int j=0;j<left[i].length&&left[i][j]!='0';j++)
13                 leftW+=status[left[i][j]-'A'];
14             for(int j=0;j<right[i].length&&right[i][j]!='0';j++)
15                 rightW+=status[right[i][j]-'A'];
16             //比较计算的平衡结果和条件所给的平衡结果,若有不相符,返回false
17             if(leftW==rightW&&result[i].equals("even")==false)return false;
18             if(leftW>rightW&&result[i].equals("up")==false)return false;
19             if(leftW<rightW&&result[i].equals("down")==false)return false;
20             //[注]按下一条件计算前,别忘了将左右两边重量重设为0
21             leftW=rightW=0;
22         }
23         //三个条件都满足,返回true
24         return true;
25     }
26     
27     public static void main(String[] args) throws IOException{
28         // TODO 自动生成的方法存根
29      BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
30      for(int n=Integer.parseInt(bf.readLine());n>0;n--){ //测试用例一个个来
31          for(int i=0;i<3;i++){
32              String []str=bf.readLine().split(" ");
33              left[i]=str[0].toCharArray();
34              right[i]=str[1].toCharArray();
35              result[i]=str[2].toString();
36          }
37          for(int i=0;i<12;i++)status[i]=0;//初始银币都设为真
38          int k=0;
39          //枚举,每次假设一枚银币为假
40          for(;k<12;k++){
41              status[k]=-1;
42              if(pdWeight())break;
43              status[k]=1;
44              if(pdWeight())break;
45              status[k]=0;//[注]若都不成立,将该枚银币重设为真
46          }
47          System.out.println((char)(k+'A')+" is the counterfeit coin and it is "+((status[k]<0)?"light.":"heavy."));
48       }
49     }
50 
51 }

 


E . N . D