代码
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
#include <utility>
using namespace std;
int num;
// 存储0~9的数量,而不是1~10,是由对“summation % 10”决定的
int counting[10];
int summation;
int main()
{
scanf("%d", &num);
for (int i = 0; i < num; i++)
{
int temp;
scanf("%d", &temp);
temp %= 10;
summation += temp;
counting[temp]++;
}
// 保证个位数相同即可
int res = summation % 10;
// 遍历两张牌的组合
// 两张牌相同与不同的判定条件不同
// 不同(不重复的遍历)
for(int i = 0; i <= 8; i++)
for (int j = i + 1; j <= 9; j++)
{
if ((i + j) % 10 == res && counting[i] && counting[j])
{
if (res == 0)
printf("%d", 10);
else
printf("%d", res);
return NULL;
}
}
// 相同
for (int i = 0; i <= 9; i++)
{
if (2 * i % 10 == res && counting[i] >= 2)
{
if (res == 0)
printf("%d", 10);
else
printf("%d", res);
return NULL;
}
}
printf("%d", 0);
return NULL;
}
算法思想
暴力求解
思想
如果去除两张牌的summation,依旧是10的倍数,那么有牛,且这两张牌决定牛几
遍历,求符合要求的两张牌组合
时间复杂度O(n^2)
遍历
优化
思想
如果存在两张牌的组合的个位数,是summation的个位数,那么有牛,且个位数决定牛几
记录不同poker出现次数counting[],使用counting数组求符合要求的两张牌
时间复杂度O(n)
输入,以及输入时求summation和counting数组
细节总结
1、对poker的计数
2、遍历0~9求数组的组合
- 不重复
- 分类
- 只需要确保个位数相同即可(因为1-10的两张牌的组合范围是2~20,尝试过分成res和res+10进行处理,判定繁琐)