1. 程式人生 > >Luogu p2107 小Z的AK計劃 題解

Luogu p2107 小Z的AK計劃 題解

題目連結

正解:貪心+堆優化

讀入的距離不一定是有序的,讀進來先要以距離為關鍵字排序,對於本身距離大於有的總時間的,或者是本身時間大於總時間的,都處理掉。然後用大根堆來存AK的機房用的時間(不要存距離)。當遇到再往裡塞一個時間要超限時,就把你前面用的最大的去掉,直到能再塞,再加上本身的距離(用while來實現)。 下面是一段醜陋的AC程式碼:

#include<bits/stdc++.h>
using namespace std;
priority_queue<int> q;
int n,total,ans,anss;
long long m,sum;
inline int
read(){ int s=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){s=s*10+c-'0';c=getchar();} return s*f; } inline void write(int x){ if(x<0){x=-x;putchar('-');} if(x>9)write(x/10); putchar(x%10+'0'); } inline long long
readl(){ long long s=0,f=1;char c=getchar(); while(!isdigit(c)){if(c=='-')f=-1;c=getchar();} while(isdigit(c)){s=s*10+c-'0';c=getchar();} return s*f; } struct node{ long long value; long long t; }a[100010]; bool cmp(node a,node b){return a.t<b.t;} int main(){ n=read
();cin>>m; for(int i=1;i<=n;i++){ long long x,y; cin>>x>>y; if(y<=m&&x<=m){ a[++total].t=x; a[total].value=y; } } sort(a+1,a+total+1,cmp); for(int i=1;i<=total;i++){ sum+=a[i].value+a[i].t-a[i-1].t; q.push(a[i].value); ans++; while(sum>m){ sum-=q.top(); q.pop(); ans--; } anss=max(anss,ans); } cout<<anss<<endl; return 0; }