题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1475
这题一开始我是用贪心去做的,但是一直没过。。。貌似贪心并不能得到最优解法。
然后这道题用优先队列来写
首先我们先把对于第i的中间站可以连接的城市用向量数组存起来。。然后在只有满足中间站数量<i的情况下才向队列中和添加元素。。然后若是队列元素大于i时把把城市人口最小的给删去。。这样就能保证每次选择的时候都能保证选的是最优选择。。
这题真的是很妙。。膜拜ing
#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> #include<queue> #include<vector> const int N=1005; using namespace std; priority_queue<int>q; vector<int>v[N]; int main() { int n,H; scanf("%d %d",&n,&H); int ans=0; int h,p; for(int i=0;i<n;i++) { scanf("%d %d",&h,&p); int x=min(n,H-h); v[x].push_back(p); } int s=0; for(int i=1;i<=n;i++) { for(;q.size()>=i;q.pop()) s+=q.top(); for(int j=0;j<v[i].size();j++) { s+=v[i][j]; q.push(-v[i][j]); } for(;q.size()>i+1;q.pop()) s+=q.top(); ans=max(ans,s); } printf("%d\n",ans); }