先放個傳送門鴨,題目大意能夠點$Descriptions$的第二個切換成中文翻譯node
而後爲了方便表述,這裏強行改一下題意(問題是同樣的只是表述不同辣,,,ios
就是說如今在高速公路上行駛,初始有$K$的油量,每走一千米要消耗一單位的油,而後路上有$N$個加油站,離終點的距離分別爲$A_i$,每次通過一個加油站能夠選擇加或者不加,加就能加$B_i$的油量,而後要求路上不能存在沒油的狀況,問最少要加幾回油ide
而後就考慮能夠理解成,每通過一個加油站,就至關於有加油的權利,因此把它加入堆中,當沒油的時候從堆中找出油量$max$就好spa
而後就作完辣!這題仍是比較水的$QAQ$.net
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<queue> using namespace std; #define il inline #define gc getchar() #define t(i) edge[i].to #define mp make_pair #define ri register int #define rb register bool #define rc register char #define lb(x) lower_bound(st+1,st+st_cnt,x)-st #define rp(i,x,y) for(ri i=x;i<=y;++i) #define my(i,x,y) for(ri i=x;i>=y;--i) #define e(i,x) for(ri i=head[x];i;i=edge[i].nxt) const int N=1e4+10; int K,f,n,nw=1,as; struct nod{int a,b;}node[N]; priority_queue<int>Q; il int read() { rc ch=gc;ri x=0;rb y=1; while(ch!='-' && (ch<'0' || ch>'9'))ch=gc; if(ch=='-')ch=gc,y=0; while(ch>='0' && ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=gc; return y?x:-x; } il bool cmp(nod gd,nod gs){return gd.a<gs.a;} int main() { freopen("2431.in","r",stdin);freopen("2431.out","w",stdout); n=read();rp(i,1,n)node[i]=(nod){read(),read()};f=read();K=read();rp(i,1,n)node[i].a=f-node[i].a;sort(node+1,node+1+n,cmp); node[++n].a=f;node[n].b=0; rp(i,1,n) { while(K<node[i].a && !Q.empty())K+=Q.top(),Q.pop(),++as; if(K>=node[i].a)Q.push(node[i].b); } if(K>=f)printf("%d\n",as);else printf("-1\n"); return 0; }