一.问题:
小明 PAT 考了满分,高兴之余决定发起微博转发抽奖活动,从转发的网友中按顺序每隔 N 个人就发出一个红包。请你编写程序帮助他确定中奖名单。
输入格式:
输入第一行给出三个正整数 M(≤ 1000)、N 和 S,分别是转发的总量、小明决定的中奖间隔、以及第一位中奖者的序号(编号从 1 开始)。随后 M 行,顺序给出转发微博的网友的昵称(不超过 20 个字符、不包含空格回车的非空字符串)。
注意:可能有人转发多次,但不能中奖多次。所以如果处于当前中奖位置的网友已经中过奖,则跳过他顺次取下一位。
输出格式:
按照输入的顺序输出中奖名单,每个昵称占一行。如果没有人中奖,则输出 Keep going...
。
输入样例 1:
9 3 2
Imgonnawin!
PickMe
PickMe
LookHere
Imgonnawin!
TryAgainAgain
TryAgainAgain
Imgonnawin!
TryAgainAgain
输出样例 1:
PickMe
Imgonnawin!
TryAgainAgain
输入样例 2:
2 3 5
Imgonnawin!
PickMe
输出样例 2:
Keep going...
二.思路:
1.弄两个二维字符数组,一个用来存储刚开始输入的M个转发的ID(shared_num[1001][25]),另一个用来存储中奖的ID(win_prices[1001][25]).
2.判断输入的S是否大于M,大于则不可能有人中奖,直接输出"Keep going..."
3.如果S小于M,则从第S个序号开始抽取获奖者ID放入win_prices[1001][25],然后每隔N个就抽出一个ID,先判断该ID是否以及出现在win_prices[1001][25]里面,如果已经有了,则往下滑一位,重复上一步判断ID是否已经出现在win_prices[1001][25]里面,直到遇到新的ID,将其存进去,然后在此基础上跳N个继续找新ID,直到超过M为止。
4.这里注意,序号是从1开始,而数组下标是从0开始,也就是说,刚开始的第一个中奖者的序号S,在数组中的下标是S-1
三.代码实现:
#include<stdio.h>
#include<string.h>
//从win_prices[0]到win_prices[end] 判断该微博ID是否已经领过奖(是否已经存在于win_prices),领过了//返回0;没领过返回1
int Is_get(char win_prices[][25],char *ID,int end)
{
if(end == 0)//第一个肯定没领过奖,直接返回1
{
return 1;
}
for(int i = 0;i < end;i++)
{
if(strcmp(win_prices[i],ID) == 0)
{
return 0;
}
}
return 1;
}
int main()
{
//输入数据
int M = 0;//转发的总量
int N = 0;//小明决定的中奖间隔
int S = 0;//第一位中奖者的序号(编号从 1 开始)
int count = 0;//用来记录win_prices里面有多少获奖者
scanf("%d %d %d",&M,&N,&S);
char shared_num[1001][25];
char win_prices[1001][25];
//输入转发的总量
for(int i = 0;i < M;i++)
{
scanf("%s",shared_num[i]);
}
//提取中奖名单
if(S > M)//如果第一位中奖者的序号大于转发的总量,直接输出Keep going...
{
printf("Keep going...\n");
}
else
{
//每隔N个提取一个人的ID,然后接着判断是否重复,这里注意第一个中奖者在数组里面的下标应该为S-1
for(int i = S-1;i < M;i += N)
{
//如果没领过奖,则把他加到获奖名单里面
if(Is_get(win_prices,shared_num[i],count))
{
strcpy(win_prices[count],shared_num[i]);
count++;
}
//如果领过奖了,移动到下一位
else
{
//循环判断,直到遇到的shared_num[i]是没出现过的
while(!Is_get(win_prices,shared_num[i],count))
{
i++;
}
//此时遇到的shared_num[i]是没出现过的,添加进win_prices
strcpy(win_prices[count],shared_num[i]);
count++;
}
}
}
//输出中奖名单
for(int j = 0;j < count;j++)
{
printf("%s\n",win_prices[j]);
}
return 0;
}