Kevin 正在一个社区中开发他的专业网络。不幸的是,他是个外地人,还不认识社区中的任何人。但是他可以与 个人建立朋友关系 。
然而,社区里没几个人想与一个外地人交朋友。Kevin 想交朋友的 个人都有类似但不同的与外地人交友的准则。在 Kevin 已经直接认识了社区中的 个人后,第 个人就愿意与 Kevin 交朋友了,否则 Kevin 就要付出 的代价与他成为朋友。
你的任务是,使 Kevin 与这 个人都交上朋友,并且最小化他付出的代价。
输入格式
第一行包含整数 。接下来的 行每行包含两个整数 和 。
输出格式
输出一行一个整数表示 Kevin 付出的最小代价。
样例
样例输入 1
4
3 3
1 2
0 5
3 4
样例输出 1
3
样例 1 解释
Kevin 可以立即与 号人成为朋友,因为已经建立了这个朋友关系,他也能与 号人成为朋友。他需要付出 的代价与 号人成为朋友,这样他一共有 个朋友,使得他能与 号人成为朋友。
样例输入 2
5
0 9
1 8
2 7
3 6
4 5
样例输出 2
0
样例 2 解释
Kevin 不用付出任何代价就能和所有人成为朋友。
样例输入 3
3
0 6
2 7
3 8
样例输出 3
8
样例 3 解释
Kevin 应该立即与 号人成为朋友,然后付出 的代价与 号人成为朋友, 最后与 号人建立朋友关系。
题解
设a[i].x 为需要的朋友数,a[i].y为付出的代价。
已经交了 i 个朋友,正在交 j 这个朋友,那么 j 的取值可以为 [0,n-1],因为朋友关系是唯一的。而想要免费交到,就需要j的取值在 [a[i].x,n-1] 内。贪心选取最大值,将数组以 a[i].y从大到小排序。
类似于不守交规那道题,那里的过期就相当于这里的 j<a[i].x。仿照此题,我们从过期的临界 a[i].x开始枚举到 n-1。
对于一个 i,如果在范围中已经没有数没有被对应到,那么它一定需要支付费用。
那么这一段的代码也就很好写了
for(int i=1;i<=N;++i){
bool f=true;
for(int j=p[i].a;j<N;++j)
if(!