poj 2692 假币问题

总时间限制:
1000ms
内存限制:
65536kB

描述
赛利有12枚银币。其中有11枚真币和1枚假币。假币看起来和真币没有区别,但是重量不同。但赛利不知道假币比真币轻还是重。于是他向朋友借了一架天平。朋友希望赛利称三次就能找出假币并且确定假币是轻是重。例如:如果赛利用天平称两枚硬币,发现天平平衡,说明两枚都是真的。如果赛利用一枚真币与另一枚银币比较,发现它比真币轻或重,说明它是假币。经过精心安排每次的称量,赛利保证在称三次后确定假币。
输入
第一行有一个数字n,表示有n组测试用例。
对于每组测试用例:
输入有三行,每行表示一次称量的结果。赛利事先将银币标号为A-L。每次称量的结果用三个以空格隔开的字符串表示:天平左边放置的硬币 天平右边放置的硬币 平衡状态。其中平衡状态用up'',down”, 或 “even”表示, 分别为右端高、右端低和平衡。天平左右的硬币数总是相等的。
输出
输出哪一个标号的银币是假币,并说明它比真币轻还是重(heavy or light)。
样例输入

1
ABCD EFGH even 
ABCI EFJK up 
ABIJ EFGH even 

样例输出

K is the counterfeit coin and it is light. 

java,c+

C++

#include <iostream>
#include <vector>
using namespace std;
//用一个结构体保存要对比的标准
struct stand{
    string left;
    string right;
    string result;
    stand(string _left="", string _right="", string _result=""):
            left(_left), right(_right), result(_result){}
};
int find_result(vector<stand> stand_v, vector<int> num_v){
    int sums=0;
    for (int k = 0; k < 3; ++k) {
        string left=stand_v[k].left, right = stand_v[k].right, result = stand_v[k].result;
        int sum_r=0, sum_l=0;
        for (int l = 0; l < left.size(); ++l) {
            sum_l += num_v[left[l]-'A'];
        }
        for (int i = 0; i < right.size(); ++i) {
            sum_r += num_v[right[i]-'A'];
        }
        if(result.compare("even") == 0 && sum_l==sum_r){
            sums += 1;
        }
        else if(result.compare("up") == 0 && sum_l>sum_r){
            sums += 1;
        }
        else if(result.compare("down") == 0 && sum_l<sum_r){
            sums += 1;
        }
    }
    if(sums == 3) return 1;
    else {
        return 0;
    }
}

int main()
{
    int r, n;
    cin>>n;
    //这个加个循环
    //初始化正确答案
    while(n--){
        vector<int> num_v;
        vector<stand >stand_v;
        for (int j = 0; j < 3; ++j) {
            string left, right, result;
            cin>>left>>right>>result;
            stand_v.push_back(stand(left, right, result));
        }
        int l;
        // 测试一下有一个重硬币的结果
        for (int k = 0; k < 12; ++k) {
            num_v.push_back(0);
        }
        for (l = 0; l < 12; ++l) {
            num_v[l]=1;
            r = find_result(stand_v, num_v);
            if(r == 1) break;
            num_v[l]=0;
        }
        if (r == 1){
            cout<<char('A'+l)<<" is the counterfeit coin and it is heavy."<<endl;
        }

        // 测试一下有一个轻硬币的结果
        for (l = 0; l < 12; ++l) {
            num_v[l]=-1;
            r = find_result(stand_v, num_v);
            if(r == 1) break;
            num_v[l]=0;
        }
        if (r == 1){
            cout<<char('A'+l)<<" is the counterfeit coin and it is light."<<endl;
        }
    }

    return 0;
}

java

import java.util.ArrayList;
import java.util.Scanner;

// 基本思想:采用枚举,将24h种情况进行一一判断
public class Main {
    public static int find_result(ArrayList<stand> stand_v, ArrayList<Integer> num_v){

        int i, sum_r, sum_l, sums=0, l=0;
        for (i=0;i<3;i++){
            String left = stand_v.get(i).left;
            String right = stand_v.get(i).right;
            String result = stand_v.get(i).result;
            sum_l=0;
            sum_r=0;
            for (int j=0;j<4;j++){
                int index_l = left.charAt(j) - 'A';
                int index_r = right.charAt(j) - 'A';
                sum_l += num_v.get(index_l);
                sum_r += num_v.get(index_r);
            }

            if (sum_l == sum_r && result.compareTo("even")==0) {

                l++;
            }
            else if(sum_l<sum_r && result.compareTo("down")==0) l++;
            else if(sum_l>sum_r && result.compareTo("up")==0) {

                l++;
            }
        }
        if(l==3)return 1;
        else return 0;
    }
    public static void main(String[] args) {
        int n, i;
        String left, right, result;
        Scanner s = new Scanner(System.in);
        n = s.nextInt();
        while(n-->0){
            ArrayList<Integer> num_v = new ArrayList<Integer>();
            ArrayList<stand> stand_v = new ArrayList<stand>();
            for(i=0;i<3;i++){
                left = s.next();
                right = s.next();
                result = s.next();
                stand_v.add(new stand(left, right, result));
            }
            int r=0;
            //初始化测试用例
            for (i=0;i<12;i++){
                num_v.add(0);
            }
            //测试重的那个
            for (i=0;i<12;i++){
                num_v.set(i, 1);
                r = find_result(stand_v, num_v);
                if (r == 1) break;
                num_v.set(i, 0);
            }
            if(r == 1)
            {
                char word = (char)('A'+i);
                System.out.println(word+" is the counterfeit coin and it is heavy.");
            }
            //测试轻的那个
            for (i=0;i<12;i++){
                num_v.set(i, -1);
                r = find_result(stand_v, num_v);
                if (r == 1) break;
                num_v.set(i, 0);
            }
            if(r == 1)
            {
                char word = (char)('A'+i);
                System.out.println(word+" is the counterfeit coin and it is light.");
            }
        }
    }
}
class stand{
    String left;
    String right;
    String result;
    public stand(String _left, String _right, String _result){
        this.left = _left;
        this.right = _right;
        this.result = _result;
    }
}
/*
1
ABCD EFGH up
ABCI EFJK up
CBIJ EFGH even
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值