总时间限制:
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.
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
*/