1124 Raffle for Weibo Followers (20 分)
发布日期:2021-05-12 19:57:33 浏览次数:18 分类:精选文章

本文共 1455 字,大约阅读时间需要 4 分钟。

为了解决这个问题,我们需要帮助 John 生成抽奖活动的赢家列表。抽奖规则是从每 N 个转发者中选出一个赢家,且每个转发者只能中奖一次。我们需要确保按顺序生成赢家名单,并避免重复。

方法思路

  • 读取输入:首先读取输入数据,包括转发者的总数 M,抽奖间隔 N,以及第一个赢家的起始位置 S。
  • 检查起始位置:如果第一个赢家的起始位置 S 超过了转发者总数 M,那么直接输出 “Keep going...”。
  • 存储转发者名单:将转发者的名字存储在一个数组中,以便后续处理。
  • 标记已选转发者:使用一个布尔数组来记录哪些转发者已经被选为赢家。
  • 遍历并选出赢家:从起始位置 S 开始,每隔 N 个转发者选出一个赢家,直到遍历完所有转发者或选出足够的赢家。
  • 输出结果:如果选出的赢家数量不够 N 个,输出 “Keep going...”;否则,按顺序输出每个赢家的名字。
  • 解决代码

    #include 
    #include
    #include
    #include
    using namespace std;
    int main() {
    int m, n, s;
    cin >> m >> n >> s;
    if (s > m) {
    cout << "Keep going..." << endl;
    return 0;
    }
    vector
    names(m + 1);
    for (int i = 1; i <= m; ++i) {
    names[i] = string();
    cin >> names[i];
    }
    bool* selected = new bool(m + 1);
    int cnt = 0;
    int i = s;
    while (i <= m) {
    if (!selected[i]) {
    selected[i] = true;
    cnt++;
    cout << names[i] << endl;
    if (cnt == n) {
    break;
    }
    }
    i += n;
    }
    if (cnt < n) {
    cout << "Keep going..." << endl;
    }
    delete[] selected;
    return 0;
    }

    代码解释

  • 读取输入:使用 cin 读取输入数据,存储到变量 m, n, s 中。
  • 检查起始位置:如果 s 超过 m,直接输出提示并返回。
  • 存储转发者名单:读取接下来的 M 行转发者的名字并存储在数组 names 中。
  • 初始化标记数组:创建一个布尔数组 selected,用来记录哪些转发者已经被选为赢家。
  • 遍历选出赢家:从位置 s 开始,每隔 N 个转发者检查一次,直到遍历完所有转发者或选出足够的赢家。
  • 输出结果:根据选出的赢家数量输出结果,如果不够,输出提示。
  • 这个方法确保了我们按顺序选出赢家,并避免重复,每个转发者只能中奖一次。

    上一篇:【浮点错误】导致浮点错误的可能原因
    下一篇:1152 Google Recruitment (20 分)

    发表评论

    最新留言

    不错!
    [***.144.177.141]2025年04月27日 13时36分26秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章