本文主要是介绍1069 微博转发抽奖,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一.问题:
小明 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-1for(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_pricesstrcpy(win_prices[count],shared_num[i]);count++;}}}//输出中奖名单for(int j = 0;j < count;j++){printf("%s\n",win_prices[j]);}return 0;
}
这篇关于1069 微博转发抽奖的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!