Hello大家好我是小亦,今天也是更新题解的第一篇,最近有点忙,一直没能更新题解,那么今天呢为了补偿大家我们来看一个最逆天的题目,这道题呢是来自AHOI 2001年安徽省选的题目,你敢相信吗,这还是国内吗哪有这么水的,当时我看的时候都惊呆了,一道省选竟然是洛谷的最垃圾水平-入门,但是正确率比较低没有超过我的预期
这么简单的题目竟然正确率那么低,作者几分钟就做出来了qwq,好那么好,今天我就来讲一下这道题的思路:
其实这道题目只要求我们判断一组彩票中每张彩票的中奖情况,并统计各个奖项的中奖张数,所以肥肠的简单,那解决这个问题的关键在于(步骤分析如下qwq):
-
理解中奖规则:首先要清楚地理解每个奖项对应的中奖条件,即彩票上的号码与中奖号码的匹配程度。
-
读取和存储数据:读取输入数据,包括彩票数量、中奖号码和每张彩票上的号码。
-
比较彩票号码和中奖号码:对于每张彩票,需要比较其号码与中奖号码之间的匹配程度。
-
确定中奖等级:根据比较结果,确定每张彩票的中奖等级。
-
统计中奖张数:对于每个奖项,统计中奖的彩票张数。
具体步骤如下:
步骤1:读取输入
- 读取彩票数量 nn。
- 读取包含7个中奖号码的数组。
步骤2:初始化计数器
- 创建一个大小为7的数组
counts
,用于存储从特等奖到六等奖的中奖张数,初始值都为0。
步骤3:读取彩票并比较
- 对于每张彩票,读取7个号码。
- 将彩票号码与中奖号码进行比较,计算匹配的号码数量。
步骤4:确定奖项
- 根据匹配的号码数量,确定彩票的中奖等级:
- 特等奖:7个号码都匹配。
- 一等奖:6个号码匹配。
- 二等奖:5个号码匹配。
- 三等奖:4个号码匹配。
- 四等奖:3个号码匹配。
- 五等奖:2个号码匹配。
- 六等奖:1个号码匹配。
步骤5:计数并输出结果
- 对于每个奖项,统计中奖的彩票张数。
- 输出每个奖项的中奖张数。
实现细节
- 排序:为了快速比较,可以将彩票号码和中奖号码排序,然后使用双指针或哈希表等方法进行比较。
- 使用集合:将中奖号码存储在集合中,以便快速检查彩票上的号码是否在中奖号码中。
代码实现
- 使用C++语言实现上述逻辑。
- 使用
vector
和set
等数据结构来存储和比较数据。 - 使用循环和条件语句来实现比较和计数逻辑。
通过以上步骤,我们可以有效地判断每张彩票的中奖情况,并统计各个奖项的中奖张数,好思路给完了,相信大家都应该能理解了对吧,好那么好代码供上,小亦再次再次再次提醒大家,抄代码可耻!
#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> winningNumbers(7);
for (int i = 0; i < 7; ++i) {
cin >> winningNumbers[i];
}
vector<int> counts(7, 0);
vector<int> ticket(7);
for (int i = 0; i < n; ++i) {
for (int j = 0; j < 7; ++j) {
cin >> ticket[j];
}
sort(ticket.begin(), ticket.end());
sort(winningNumbers.begin(), winningNumbers.end());
int matchCount = 0;
set<int> winningSet(winningNumbers.begin(), winningNumbers.end());
for (int num : ticket) {
if (winningSet.count(num)) {
++matchCount;
}
}
if (matchCount == 7) counts[0]++;
else if (matchCount == 6) counts[1]++;
else if (matchCount == 5) counts[2]++;
else if (matchCount == 4) counts[3]++;
else if (matchCount == 3) counts[4]++;
else if (matchCount == 2) counts[5]++;
else if (matchCount == 1) counts[6]++;
}
for (int i = 0; i < 7; ++i) {
cout << counts[i] << (i < 6 ? " " : "\n");
}
return 0;
}
放心食用~