题目
小明PAT考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔N个人就发出一个红包。请你编写程序帮助他确定中奖名单。
输入格式:
输入第一行给出三个正整数M(<=1000)、N和S,分别是转发的总量、小明决定的中奖间隔、以及第一位中奖者的序号(编号从1开始)。随后M行,顺序给出转发微博的网友的昵称(不超过20个字符、不包含空格回车的非空字符串)。
注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。
输出格式:
按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出“Keep going…”。
输入样例1:
9 3 2
Imgonnawin!
PickMe
PickMeMeMeee
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
输出样例1:
PickMe
Imgonnawin!
TryAgainAgain
输入样例2:
2 3 5
Imgonnawin!
PickMe
输出样例2:
Keep going…
思路(注意事项)
搞了两小时不知道我的代码测试点3为什么过不了,网上和大模型也找不出错误。。。
附一个其他人的题解,通过改变s找到对应的得奖人。
代码(过不了测试点3)
#include<bits/stdc++.h>
using namespace std;
int main(){
map<string, int> mp;
int m , n, s, t = 0;
cin >> m >> n >> s;
if (m < s){
cout << "Keep going..." << endl;
return 0;
}
int flag = 0;
for (int i = 1; i <= m; i ++)
{
string str;
cin >> str;
if ((i < s || mp[str] == 1) && t != n)
{
t ++;
continue;
}
if (t < 3) t ++;
if (i == s||t == n)
{
mp[str] = 1;
flag = 1;
cout << str << endl;
t = 0;
}
}
if (flag == 0) cout << "Keep going..." << endl;
return 0;
}
其他人AC题解
#include<iostream>
#include<map>
using namespace std;
int main()
{
int s, m, n;
cin >> m >> n >> s;
map<string, int>user;
if (m < s)
{
cout << "Keep going..." << endl;
return 0;
}
else
for (int i = 1; i <= m; i++)
{
string input;
cin >> input;
if (i >= s && (i - s) % n == 0)
if (user[input] > 0)
{
s++;
continue;
}
else
{
user[input]++;
cout << input << endl;
}
}
}
AC注释
#include<iostream>
#include<map>
using namespace std;
int main() {
int s, m, n;
cin >> m >> n >> s; // 输入转发总量 m、中奖间隔 n、第一位中奖者序号 s
map<string, int> user; // 用于记录已经中奖的网友
// 如果转发总量小于第一位中奖者序号,直接输出 "Keep going..."
if (m < s) {
cout << "Keep going..." << endl;
return 0;
}
// 遍历所有转发用户
for (int i = 1; i <= m; i++) {
string input;
cin >> input; // 输入网友昵称
// 如果当前序号大于等于 s,并且满足中奖间隔
if (i >= s && (i - s) % n == 0) {
// 如果当前用户已经中过奖,顺延到下一个位置
if (user[input] > 0) {
s++; // 顺延中奖位置
continue; // 跳过当前用户
} else {
user[input]++; // 标记为已中奖
cout << input << endl; // 输出中奖者昵称
}
}
}
return 0;
}