题意:先排序最小的距离,这个用vector容器实现,然后将按照从小到大的顺序压入加入你的总人口数,用队列存储人数最小的,当无法容纳这么多个城市时再将按顺序减掉人口最小的即可
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <vector>
using namespace std;
#define M 1010
vector<int> vec[M];
int main()
{
int n, h, hi, pi, top;
scanf("%d%d", &n, &h);
for(int i=0; i<n; i++)
{
scanf("%d%d", &hi, &pi);
top = min(n, h-hi);
vec[top].push_back(pi);
}
priority_queue<int> q;
int s = 0, ans = 0;
for(int i=1; i<=n; i++)
{
for(; q.size()>=i; q.pop())
{
s += q.top();//先进行剔除最后面的两个链接点的一个
}
for(int j=0; j<vec[i].size(); j++)
{
s += vec[i][j];//先全部压入
q.push(-vec[i][j]);//将值变成负数压入队列
}
for(; q.size()>i+1; q.pop())//大于i+1就是为了照顾最后面的那个两个链接点
{
s += q.top();//如果当前的数有多余的,那么从最小人口的开始剔除
}
ans = max(s, ans);
}
printf("%d\n", ans);
return 0;
}