小明 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…
解题思路:
从第一个中奖者开始,通过循环,再次遍历数组,找到数组里与该中奖者为同一人的数组元素下表,在标记数组里做标记,以此类推。输出时通过判断标记数组的标记输出即可。
附:
1. 要声明一个k,作用是如果有符合条件的中奖者就不为初始值。最终需要判断一下有无中奖者。
2. 难点:如果某一个中奖者在之前已经中过奖,那么机会应当轮到下一个中奖者,但是仍然需要判断该中奖者是不是已经中过奖的,如果是,继续向下轮。
代码:
#include<iostream>
#include<string>
using namespace std;
int main()
{
int sum, num, space, i, j, flag[1000] = { 0 }, k = 0;
string people[1000];
cin >> sum >> space >> num;
for (i = 0; i < sum; i++)
{
cin >> people[i];
}
for (i = num - 1; i < sum; i+=space)
{
if (flag[i] == 0)
{
cout << people[i] << endl;
k++;
for (j = 0; j < sum; j++)
{
if (people[i] == people[j])
{
flag[j] = 1;
}
}
}
else if (flag[i] != 0 && i + 1 < sum)
{
//cout << people[i + 1] << endl;
for (j = i + 1; j < sum; j++)
{
if (flag[j] == 0)
{
cout << people[j] << endl;
k++;
break;
}
}
i = j;
}
else if (flag[i] != 0 && i + 1 == sum)
{
break;
}
}
if (k == 0)
{
cout << "Keep going...";
}
return 0;
}
ps:博主能力有限,如果读者发现什么问题,欢迎私信或评论指出不足。欢迎读者询问问题,乐意尽我所能解答读者的问题。欢迎评论,欢迎交流。谢谢大家!