程序设计竞赛校初赛

来源:互联网 发布:java调用ie内核 编辑:程序博客网 时间:2024/05/21 01:56
为了使自己的球技不断提高,罗贝托必须每天训练。他手上有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

32 101 51 7102 995 294 828 723 868 243 697 443 792 19

Sample Output

17515
#include<cstdio>//因为结果很大,得用long long 我一直用int ,wa了十几次。。。。。吐血#include<algorithm>#include<queue>using namespace std;#define MAX 100000+16struct 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

1500 3150 300100 200470 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