2018年9月8日提高组模拟赛 T2 剑与魔法(dragons)

版权声明:转载无所谓的。。。 https://blog.csdn.net/xuxiayang/article/details/82529301

大意

给定一个序列,再规定在某些数之前只能选择一定的数量,求最大获取价值


思路

因为这个获取数量是不断往后推的,也就是说我们始终都要保证空缺至少有一个,然后我们维护一个堆,若是放入则直接放入,若是限制则调整,这样就可以得到最优解了


代码

#include<cstdio>
#include<queue>
using namespace std;int ans,n,a[200001];char c[200001];
inline int read()
{
    char c;int d=1,f=0;
    while(c=getchar(),c<48||c>57)if(c=='-')d=-1;f=(f<<3)+(f<<1)+c-48;
    while(c=getchar(),c>47&&c<58)f=(f<<3)+(f<<1)+c-48;
    return d*f;
}
inline void write(register int x){if(x<0)putchar('-'),x=-x;if(x>9)write(x/10);putchar(x%10+48);return;}
priority_queue<int>q;
signed main()
{
    n=read();
    for(register int i=1;i<=n;i++)
    {
        while(c[i]=getchar(),c[i]!='c'&&c[i]!='e');
        a[i]=read();//输入
    }
    for(register int i=1;i<n;i++)
    if(c[i]=='c')q.push(-a[i]);else while(q.size()>a[i]-1) q.pop();//因为我们要尽量让大的待在堆中,所以我们就用小根堆来,这样就可以踢出所有不满足且不忧的答案
    while(q.size()) ans+=-q.top(),q.pop();//求和
    printf("%d",ans);//输出
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/82529301
今日推荐