【练习】1069 微博转发抽奖

题目

小明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…

来源:PAT 乙 1069 微博转发抽奖


思路(注意事项)

搞了两小时不知道我的代码测试点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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值