OCAC暑期比赛第二场 G题 一码英雄传说 题解

一码英雄传说
原题链接:http://codeforces.com/problemset/problem/349/A
【题目描述】
最近一步豆瓣评分高达10分的史诗级电影《一码英雄传说》上映了。
这部电影讲述了一名五年级的学生在进入一码学程学习编程后,从一名平平无奇的五年级学生,一下次转变成了一名非常厉害的信息学竞赛选手,并在六年级的时候代表国家队参加比赛并获得IOI金奖的励志故事。
电影上映当天可谓是万人空巷。
今天《一码英雄传说》在爱丽丝魔法王国也上映了。
已知在爱丽丝魔法王国只有3种币值的魔法币,它们对应的币值是25,50和100。
在爱丽丝魔法王国,一张《一码英雄传说》的电影票的票价是25。
也就是说,如果一个人来电影院买票,如果他给的魔法币的币值是25,那么售票员收下这块魔法币并给他一张电影票;
如果顾客的魔法币的币值是50,那么售票员收下这块魔法币并给他一张电影票,同时还需要返还他一块币值为25的魔法币;
如果顾客的魔法币的币值是100,那么售票员收下这块魔法币并给他一张电影票,同时还需要返还他75魔法币(一块币值为50的魔法币+一块币值为25的魔法币,或者3块币值为25的魔法币)。
已知现在有 n 个人排队买电影票,他们每个人只带了一块魔法币(币值可能是25、50或者100)。
但是粗心的售票员今天忘了带钱包了。
但是他心想讲不定不一定要钱包也能正常找这 n 个人的硬币呢?
不过这也得看情况的。
例如:
如果 n == 4 并且这4个人手上拿的魔法币的币值依次是 25,25,50,50,那么售票员能够正常售出这4张电影票。
如果 n == 2 并且这2个人受伤拿的魔法币的币值一次是 25,100,那么售票员就不能正常售出这2张电影票,因为他没有办法找第2个人的钱。
请帮助售票员确定是否可以正常售出这 n 张电影票。
【输入格式】
输入的第一行包含一个整数 n (1<=n<=10^5),用于表示排队买电影票的人数。
接下来一行包含 n 个整数,以空格分隔,用于表示队伍从前往后,每个人手上拿着的魔法币的币值(仅限于25,50或100)。
【输出格式】
如果售票员能够正常售出这 n 张电影票,输出“YES”;否则,输出“NO”。
【样例输入1】
4
25 25 50 50
【样例输出1】
YES
【样例输入2】
2
25 100
【样例输出2】
NO
【样例输入3】
4
50 50 25 25
【样例输出3】
NO
【问题分析】
这道题目设计算法:贪心。
首先,如果当前队首人的币值是25,售票员获得一个25的魔法币,卖出一张票;
如果当前队首人的币值是50,售票员要取出一个25的魔法币,取不出来,则“NO”,同时获得一个50的魔法币;
如果当前队首人的币值是100,则优先考虑还给他一个50的魔法币和一个25的魔法币;如果没有50的魔法币,则考虑还给他3个25的魔法币;如果这两种方案都没法换,则“NO”。
如果所有的人都买好票了,则正常结束,“YES”。
实现代码如下:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;

int n, a, cnt25, cnt50;

int main() {
    cin >> n;
    while (n --) {
        cin >> a;
        if (a == 25) cnt25 ++;
        else if (a == 50) {
            cnt50 ++;
            if (!cnt25) { puts("NO"); return 0; }
            cnt25 --;
        }
        else {  // 100
            if (cnt50 && cnt25) {
                cnt50 --;
                cnt25 --;
            }
            else if (cnt25 >= 3) {
                cnt25 -= 3;
            }
            else {
                puts("NO");
                return 0;
            }
        }
    }
    puts("YES");
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/ocac/p/11131658.html
今日推荐