Poj 1013 假币

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;
	}
}
上一篇:Is It Rated? 题解


下一篇:pandas使用read_csv函数读取文件指定不读取表头信息(header)、pandas使用read_csv函数读取文件通过names函数自定义设置dataframe的表头