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-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;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yuga...

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值