2018年全国多校算法寒假训练营练习比赛(第二场)D YB要打炉石

签到题,最大不下降子序列,注意细节问题

题目描述
Wozuinb非常喜欢打炉石传说,但是菜的不行,所以他决定打
竞技场来练练手。系统按顺序给出n张卡牌,每张卡牌都有自
己的使用消耗a[i],每次只给出一张,wozuinb可以选择或者
弃掉这张牌。每选择一张牌都会按选择顺序放在卡槽中,当
卡槽中放满30张即可组成一套套牌。Wozuinb希望自己的套牌的
消耗满足一个平滑的曲线,即30张卡牌都满足第i张卡牌的消耗
不小于第i-1张(i>1)。请你帮助wozuinb看一看,这些卡牌能不
能组成想要的套牌,如果能组成输出“yes”,如果不能输出“no”。


输入描述:
第一行输入一个整数n0<n<100
第二行输入一行数字a[i],每个数字用空格隔开,代表第i张出现的卡牌的消耗。


输出描述:
输出一行,“yes”或“no”
示例1
输入
5
1 2 3 4 5
输出
no

代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int INF=1000001;
int main(void){
    int n;
    scanf("%d",&n);
    if(n<30){
        printf("no\n");
        return 0;
    }
    else{
        int a[101],dp[101],g[101];
        for(int i=0;i<n;i++){
            scanf("%d",&a[i]);
        }
        memset(g,INF,sizeof(g));
        for(int i=0;i<n;i++){
            int k=upper_bound(g+1,g+n,a[i])-g;
            dp[i]=k;
            g[k]=a[i];
        }
        int m=0;
        for(int i=0;i<n;i++){
            if(dp[i]>m){
                m=dp[i];
            }
        }
        if(m>=30){
            printf("yes\n");
        }
        else{
            printf("no\n");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/westbrook1998/article/details/80194671
今日推荐