选举(C++语言)

在遥远的相簿国有两个种族,分别是冬马族和雪菜族,每个人都属于这两个种族之一。如今,又到了选举元首的时候了,所有 n 个人排成一排等待投票。

    相簿国的选举制度比较奇特,并不是看谁的票数多,而是使用一票否决制度,并且所有人都可以投一张票或者不投票。如果排在前面的人把排在后面的人一票否决了,那么后面的人不能参与竞选,也不能投出他的那一票了。而如果排在后面的人把排在前面的人一票否决了,那么排在前面的人不能参与竞选,但是已经投出的那一票仍然有效。如果一轮投完仍然有不只一个竞选者,那么这些留下的人再投一轮,还没有停止就再投一轮……直到剩下一人为止,但投票的先后顺序不变。

    为了保证每轮投票中都有更多人可以投票,规定竞选者优先投票给在他投票时已经投过票的异族人,每轮投票结束时重置竞选人的投票状态

    所有人都希望自己族的人能当选元首(而不是希望自己当元首),并且会为此采取最优策略。现在给出排队中每个人的种族,请问最后是哪个种族的人会当选元首?

输入

输入第一行一个数 n ,表示相簿国里的人数。

第二行一个长度为 n 的字符串 s ,从前到后依次表示排队投票的人所属的种族。D 表示冬马族,而 X 表示雪菜族。

输出

输出一个字符 D 或 X ,表示是哪一族的人当选。

注意

数据保证1<=n <=200000。

测试用例

用例1.

输入:

5↵

DDXXX↵

输出:

D↵

用例2.

输入:

6↵

DDXXXX↵

输出:

X↵


样例

输入(1)

5
DDXXX

输出(1)

D

输入(2)

6
DDXXXX

输出(2)

X

代码

#include <iostream>
#include <stack>
using namespace std;

int main() {
    int n;
    string s;
    stack<char> st;  // Stack to store candidates with voting rights
    int D = 0, X = 0;  // Count of voting rights for each tribe
    char last;  // To store the last candidate

    cin >> n;
    cin >> s;

    for (int i = 0; i < s.size(); i++) {
        if (s[i] == 'D') {
            if (X == 0) {
                if (st.empty() || st.top() == 'D') {
                    st.push('D');
                    D++;
                } else {
                    st.pop();
                    int num = 1;
                    while (i < n - 1 && s[i + 1] == 'D' && !st.empty() && st.top() == 'X') {
                        i++;
                        st.pop();
                        num++;
                    }
                    while (num--) {
                        st.push('D');
                    }
                }
            } else {
                X--;
            }
        } else if (s[i] == 'X') {
            if (D == 0) {
                if (st.empty() || st.top() == 'X') {
                    st.push('X');
                    X++;
                } else {
                    st.pop();
                    int num = 1;
                    while (i < s.size() - 1 && s[i + 1] == 'X' && !st.empty() && st.top() == 'D') {
                        i++;
                        st.pop();
                        num++;
                    }
                    while (num--) {
                        st.push('X');
                    }
                }
            } else {
                D--;
            }
        }
    }

    int D1 = 0, X1 = 0;

    while (!st.empty()) {
        if (st.size() == 1) last = st.top();
        if (st.top() == 'D') D1++;
        else X1++;
        st.pop();
    }

    if (D1 > X1) cout << 'D' << endl;
    else if (X1 > D1) cout << 'X' << endl;
    else cout << last << endl;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值