为了使自己的球技不断提高,罗贝托必须每天训练。他手上有N份训练计划,每份训练计划正好会占用他一天的时间。罗贝托从第一天开始训练,他可以任意安排这些训练的顺序,
第i份训练的能力提升为Pi,截止日期为Di。在截止日期后才完成的训练没有能力提升。请帮助罗贝托规划每天的训练,使他获得的能力值提升最大。
Input
输入包含多组数据。
对于每组数据:
第一行: 单个整:N,1<=N<=10^5
第二行到第N+1行:第i+1行有两个整数:Di和Pi,1<=Di<=10^9, 1<=Pi<=10^9
Output
对于每组数据,输出一行,一个整数,表示能获得的最大的能力值。
Sample Input
3
2 10
1 5
1 7
10
2 99
5 29
4 82
8 72
3 86
8 24
3 69
7 44
3 79
2 19
Sample Output
17
515
#include<cstdio>//因为结果很大,得用long long 我一直用int ,wa了十几次。。。。。吐血
#include<algorithm>
#include<queue>
using namespace std;
#define MAX 100000+16
struct node
{
int d,p;
}t[MAX];
bool cmp(const node &a,const node &b)
{
return a.d<b.d;
}
int main(void)
{
int n,i,front,k,ans;
long long res;
priority_queue<int>que;
while(~scanf("%d",&n))
{
front=0,res=0;
for(i=0;i<n;i++)
{
scanf("%d%d",&t[i].d,&t[i].p);
}
sort(t,t+n,cmp);
if(n==1)
{
printf("%d\n",t[0].p);
continue;
}
front=n-1;
for(k=front;k>=0;k--)
{
if(k-1>=0)
{
if(t[k].d==t[k-1].d)
{
que.push(t[k].p);
}
else
{
que.push(t[k].p);
ans=t[k].d-t[k-1].d;
while(ans&&!que.empty())
{
res+=que.top();
que.pop();
ans--;
}
}
}
else
{
ans=t[0].d;
que.push(t[0].p);
while(ans&&!que.empty())
{
res+=que.top();
que.pop();
ans--;
}
}
}
while(!que.empty())
que.pop();
printf("%lld\n",res);
}
return 0;
}
Description
景观水道是江安一道非常靓丽的风景,一共有L mathons(这是Mathon发明的长度单位)长,每隔一mathon都有一颗银杏树即0, 1, 2, …, L都有一棵银杏树。Mathon非常喜欢景观水道,
时常会来景观水道走走。
昨晚成都狂风大作,大雨倾盆,据说景观水道不少区域里所有的树都被连根拔起。Mathon知道后感到非常伤心,他想知道这场大风过后还剩下多少银杏树,你能帮帮他么。
Input
输入包含多组数据。第一行为测试数据的组数 T <=10
接下来有T组数据,每组数据的第一行为1<=L<=10000 和 1<=M<=100 ,L表示景观水道的长度,M表示区域的数目。
接下来的M行每行包含两个不同的整数0<=l<=r<=L表示区域的范围[l, r],不同的区域可能有重合的部分。
Output
每组数据输出一行,输出大风过后景观水道还剩下多少银杏树。
Sample Input
1
500 3
150 300
100 200
470 471
Sample Output
298
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int T,s[20000+16],vis[20000+16],L,M,i,l,r;
long long res=0;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
memset(s,0,sizeof(s));
scanf("%d%d",&L,&M);
for(i=0;i<M;i++)
{
scanf("%d%d",&l,&r);
vis[l]++;
vis[r+1]--;
}
res=0;
s[0]=vis[0];
for(i=1;i<=L;i++)
s[i]=s[i-1]+vis[i];
for(i=0;i<=L;i++)
if(!s[i])
res++;
printf("%lld\n",res);
}
}