soj 4539 贪心+优先队列

xiaoxiao2021-02-28  25

不难,想到优先队列就比较容易做,具体思路见代码注释

也可以使用  重载小于号写到结构体内

如果按能力值排序会比较麻烦一点

#include<cstdio> #include<algorithm> #include<queue> using namespace std; const int N = 1e5+16; struct Node { int d,p;//deadline p是能力值 }node[N]; bool cmp(const Node &A,const Node &B)//按截至时间排序, //如果按能力值排序,在查找空闲时间的时候会增大时间复杂度,需要用到并查集来优化查找 { return A.d<B.d; } int main()//按照排序后 d的时间间隔来确定在优先队列选择几个加入res res表示最大能力值 { int n,i,sum,k,count;//count:间隔 long long res; priority_queue<int> q; while(~scanf("%d",&n)) { sum=0,res=0; for(i=0;i<n;i++) { scanf("%d%d",&node[i].d,&node[i].p); } sort(node,node+n,cmp); if(n==1) { printf("%d\n",node[0].p); continue; } sum=n-1; for(k=sum;k>=0;k--) { if(k-1>=0) { if(node[k].d==node[k-1].d) { q.push(node[k].p); } else { q.push(node[k].p); count=node[k].d-node[k-1].d; while(count!=0&&!q.empty()) { res+=q.top(); q.pop(); count--; } } } else { count=node[0].d; q.push(node[0].p); while(count&&!q.empty()) { res+=q.top(); q.pop(); count--; } } } while(!q.empty()) q.pop(); printf("%lld\n",res); } return 0; }

转载请注明原文地址: https://www.6miu.com/read-2632438.html

最新回复(0)