小明喜欢与同伴玩扑克游戏。几副不全的仅有数字标记作为牌张的扑克拼叠一起,小明在一副牌中会拿到n张牌,某张牌K可能会重复出现B次,其点数就是K*B,一副牌中各个牌张最大的点数就是该副牌的赢点。小明对于拿到手的牌,该以什么牌去PK同伴呢?请你设计解决。(若出现多组解,输出单张点数小的牌)C++
时间: 2023-11-23 12:05:39 浏览: 83
可以使用桶排序的思想来解决这个问题。首先,我们可以遍历整副牌,统计每张牌出现的次数。然后,根据每张牌的点数和出现次数,计算出每个点数对应的最大赢点。最后,从大到小遍历所有点数,找到第一个最大赢点不为0的点数,输出即可。
以下是代码实现:
```c++
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
int cnt[15] = {0}; // 统计每张牌出现次数
for(int i=0; i<n; i++)
{
int k;
cin >> k;
cnt[k]++;
}
int max_points[15] = {0}; // 计算每个点数对应的最大赢点
for(int i=1; i<=13; i++)
{
for(int j=1; j<=4; j++)
{
int points = i * cnt[i]; // 点数
int win_points = 0; // 赢点
if(cnt[i] >= j) // 该点数有足够的牌张
{
if(j == 1) win_points = points;
else if(j == 2) win_points = points * 2;
else if(j == 3) win_points = points * 3;
else if(j == 4) win_points = points * 10;
}
max_points[i] = max(max_points[i], win_points);
}
}
int ans = 0; // 最终输出的点数
for(int i=13; i>=1; i--)
{
if(max_points[i] > 0)
{
ans = i;
break;
}
}
cout << ans << endl;
return 0;
}
```