• CF749C Voting


    题目链接:

    http://codeforces.com/problemset/problem/749/C

    题目大意:

    共有n个人,编号为1~n。他们每个人属于且仅属于R阵营或N阵营中的一个。现在他们要进行一场投票。投票可能进行多轮,每一轮投票都是按照从1~n的顺序,当轮到某一人投票的时候,他可以什么都不做,也可以随便挑选一人使他丧失投票的权利。每个人都会代表自己阵营的利益。一个人如果丧失了投票权利,则他直到这场投票结束都不能再投票。投票直到某一阵营一个人都没有的时候就会结束,此时一个人都没有的阵营失败,另一个阵营获胜。

    现在给定每个人所属的阵营,问最后哪个阵营会获胜。

    解题思路:

    采用贪心的思路,每个人都干掉自己后面投票的第一个对手。

    具体来说就是用两个队列来模拟两个阵营。分别为D-队列和R-队列。初始分别按顺序加入自己阵营的所有人的编号。每次队头的两个人pk,编号小的一方获胜,将获胜方编号+n并且push到队尾(表示本轮投票结束,将进行下轮投票),失败方直接从本方队列中pop掉即可。最终队列空的一方失败,另一方获胜。

    代码:

     1 #include <iostream>
     2 #include <string>
     3 #include <cstdio>
     4 #include <queue>
     5 using namespace std;
     6 
     7 int n;
     8 string s;
     9 
    10 int main()
    11 {
    12     cin >> n >> s;
    13     queue<int> qd, qr;
    14     for (int i = 0; i < n; i++)
    15     {
    16         if (s[i] == 'D')
    17         {
    18             qd.push(i);
    19         }
    20         else
    21         {
    22             qr.push(i);
    23         }
    24     }
    25     while (!qd.empty() && !qr.empty())
    26     {
    27         if (qd.front() < qr.front())
    28         {
    29             qr.pop();
    30             qd.push(qd.front() + n);
    31             qd.pop();
    32         }
    33         else
    34         {
    35             qd.pop();
    36             qr.push(qr.front() + n);
    37             qr.pop();
    38         }
    39     }
    40     if (qd.empty())
    41     {
    42         cout << "R" << endl;
    43     }
    44     else
    45     {
    46         cout << "D" << endl;
    47     }
    48     return 0;
    49 }
  • 相关阅读:
    MFC/HALCON混合编程系列三_CFielDialog打开文件对话框
    MFC/HALCON混合编程系列二_打开两幅图_MFC布局_
    MFC/HALCON混合编程系列一_相机打开图像_简单处理_
    MFC C++ Cstring与string互转
    ImageMagik——开发篇(转)
    二维码解码器Zbar+VS2010开发环境配置(使用opencv库)
    select @@Identity 返回自动递增字段的值
    WebStorm设置左侧菜单栏背景和字体设置
    Chrome插件推荐
    WebStorm常用快捷键
  • 原文地址:https://www.cnblogs.com/wangyiming/p/6207324.html
Copyright © 2020-2023  润新知