暑假集訓day12
阿新 • • 發佈:2017-07-12
std () 之前 urn esp != bsp ext vector
今天算是結業考了。
我很弱,才170。
下面給出我AC的一道題。
beatbear
好像沒有題面是吧
那就不管它吧
題意,給出n個關卡,關卡分2種:d和p。
如果是d,後面會跟著一個數,表示取這個點得到的值。
如果是p,後面會跟著一個數,表示在其之前取的點數不能大於或等於這個數。
另有一個m,表示在過了n個關卡之後如果取的點數要不小於m,
如果小於或等於表示無解,否則輸出取點得到的值的總和最大的。
我用一個優先隊列,如果遇到d就存入隊列,遇到p就pop,直到之前取的點數小於給出的數。
然後莫名其妙的就跑得比標程快了,
果然是“玄學出正解,暴力踩標程”。
其實這個是正解
#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<vector> using namespace std; inline int read(){ int num=0,t=1;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; }int n,m,num=0;long long sum=0; priority_queue< int,vector<int>,greater<int> >q; int main() { freopen("beatbear.in","r",stdin); freopen("beatbear.out","w",stdout); n=read();m=read(); for(int i=1;i<=n;i++){ char c=getchar(); while(c!=‘p‘&&c!=‘d‘)c=getchar(); int x=read(); if(c==‘d‘){sum+=x;num++;q.push(x);} else{ while(num>=x){ int tmp=q.top();q.pop(); num--;sum-=tmp; } } } if(num<m)puts("Fox can not beat bear."); else cout<<sum; return 0; }
本文由Yzyet編寫,網址為www.cnblogs.com/Yzyet。非Yzyet同意,禁止轉載,侵權者必究。
暑假集訓day12