leetcode5914.值相等的最小索引
阿新 • • 發佈:2021-10-31
反悔貪心
顯然要把逃生能力弱的先送出去,也就是排個序。
這時候剩下的怎麼辦,萬一有一些手長腿短的怎麼辦
先假設所有小矮人站成一排,然後一個個逃。
逃無可逃時候,看看把已經逃出去的中腿最長的拉下來會不會答案更優。
#include<cstdio> #include<iostream> #include<cstring> #include<iomanip> #include<cmath> #include<stack> #include<queue> #include<algorithm> using namespace std; template<class T>inline void read(T &x) { x=0;register char c=getchar();register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar(); if(f)x=-x; } template<class T>inline void print(T x) { if(x<0)putchar('-'),x=-x; if(x>9)print(x/10); putchar('0'+x%10); } int n; struct dw{ int a; int sum; friend bool operator <(dw x,dw y){ return x.a<y.a; } }dd[100005]; priority_queue<dw> q; bool cmp(dw x,dw y){ return x.sum==y.sum?x.a>y.a:x.sum<y.sum; } int h; int st; int cnt; int main(){ read(n); for(int i=1;i<=n;++i){ read(dd[i].a);read(dd[i].sum); dd[i].sum+=dd[i].a; st+=dd[i].a; } read(h); sort(dd+1,dd+n+1,cmp); for(int i=1;i<=n;++i){ //cout<<st<<endl; if(st+dd[i].sum-dd[i].a>=h){ st-=dd[i].a; q.push(dd[i]); continue; } if(!q.empty()){ if(st+q.top().a+dd[i].sum-dd[i].a>=h){ if(q.top().a>dd[i].a){ st+=q.top().a-dd[i].a; q.pop(); q.push(dd[i]); cnt++; continue; } } } cnt++; } cout<<n-cnt; return 0; }