whenever

  • Home

  • Tags21

  • Categories6

  • Archives122

  • About

PAT乙级1069 || 微博转发抽奖(详解,C/C++示例,测试点分析)

Posted on 2019-10-20 In PAT

微博转发抽奖

题目描述

小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包。请你编写程序帮助他确定中奖名单。

输入格式

输入第一行给出三个正整数 M(≤ 1000)、N 和 S,分别是转发的总量、小明决定的中奖间隔、以及第一位中奖者的序号(编号从 1 开始)。随后 M 行,顺序给出转发微博的网友的昵称(不超过 20 个字符、不包含空格回车的非空字符串)。

注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。

输出格式

按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出 Keep going...。

输入样例1

1
2
3
4
5
6
7
8
9
10
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain

输出样例1

1
2
3
PickMe
Imgonnawin!
TryAgainAgain

输入样例2

1
2
3
2 3 5
Imgonnawin!
PickMe

输出样例2

1
Keep going...

问题解决

解题思想

因为不能中奖多次,故建立昵称与整型数的映射,已经中奖输出的做以标记,下次再遇到时不再输出直接跳过。

没人中奖的情况即为转发总量小于第一位中奖序号,可先判断是否满足此情况,满足则直接输出Keep going...即可。

代码示例(C/C++)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <iostream>
#include <cstdio>
#include <string>
#include <map>
using namespace std;
int main() {
string str;
map <string, int> mp; //建立昵称与整型数的映射
int m, n, s;
scanf("%d%d%d", &m, &n, &s);
if(s > m) { //转发总量小于第一位中奖序号则没人中奖
printf("Keep going...");
}
else {
int tmp = s;
for(int i = 1; i <= m; i++) {
cin >> str;
if(i == tmp && mp[str] == 0) {
cout << str << endl;
tmp += n;
mp[str] = 1; //标记已中奖
}
else if(i == tmp && mp[str] == 1) { //已中过奖则跳过取下一位
tmp++;
}
}
}
return 0;
}

题目来源:PAT乙级1069
作者:CHEN, Yue
单位:浙江大学

稀罕作者
Mengzhao Wang WeChat Pay

WeChat Pay

Mengzhao Wang Alipay

Alipay

# C/C++ # PAT # 编程
PAT乙级1068 || 万绿丛中一点红(详解,C/C++示例,测试点分析)
PAT乙级1070 || 结绳(详解,C/C++示例,测试点分析)
  • Table of Contents
  • Overview
Mengzhao Wang

Mengzhao Wang

Try? All the way !
122 posts
6 categories
21 tags
  1. 1. 微博转发抽奖
    1. 1.1. 题目描述
    2. 1.2. 输入格式
    3. 1.3. 输出格式
    4. 1.4. 输入样例1
    5. 1.5. 输出样例1
    6. 1.6. 输入样例2
    7. 1.7. 输出样例2
    8. 1.8. 问题解决
      1. 1.8.1. 解题思想
      2. 1.8.2. 代码示例(C/C++)
© 2021 Mengzhao Wang