程序设计竞赛校初赛

为了使自己的球技不断提高,罗贝托必须每天训练。他手上有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);
		
	}
} 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值