1. 题目详情:点击查看
2. 题目分析:
-
题目给出3组硬币称量的数据,包括左盘的硬币、右盘的硬币和天平的状态,要求我们找出其中的假币(只有1个)并判断它比真币重还是轻
-
理解完题目有几点要知道:
(1)当天平的状态为平衡(even)时,天平两端的硬币必为真币
(2)处于两种不同状态的硬币一定是真的 -
以下代码解决的方法是用三个数组来存储硬币的三次状态(初始化数组为0 )
(3)处于even状态的硬币必为真币(even数组)
(4)up和down数组存储硬币出现这两种状态的次数,次数差值的绝对值越大,是假币的概率越大
(5)满足次数差值绝对值最大且这个对应的硬币不处于even数组这两个条件的硬币就是假币
3.代码示例
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
int even[20] = { 0 };
int up[20] = { 0 };
int down[20] = { 0 };
char list1[3][6], list2[3][6], list3[3][6];
//录入信息并记录状态
for (int i = 0; i < 3; i++)
{
cin >> list1[i] >> list2[i] >> list3[i];
for(int j = 0;list1[i][j]&&list2[i][j];j++)
{
switch (list3[i][0])
{
case 'e':
even[list1[i][j] - 'A']++;
even[list2[i][j] - 'A']++;
break;
case 'u':
up[list1[i][j] - 'A']++;
down[list2[i][j] - 'A']++;
break;
case 'd':
down[list1[i][j] - 'A']++;
up[list2[i][j] - 'A']++;
break;
default:
break;
}
}
}
int max = -1; int ans = 0;
for (int i = 0; i < 12; i++)
{
if (down[i] && up[i]) //2.(2)
{
even[i]++;
}
if (even[i]!=0) //2.(3)
{
continue;
}
if (abs(down[i] - up[i]) > max) //2.(5)
{
max = abs(down[i] - up[i]);
ans = i;
}
}
cout << (char)('A'+ans) << " is the counterfeit coin and it is "
<< (up[ans] < down[ans] ? "light." : "heavy.")<<endl;
}
}