2018.06.23【2018提高组】模拟B组
【五校联考2day1】任务 (Standard IO)
题目:
英勇的福克斯有一个使命,从不同的行星收集尽可能多的燃料。有N个行星,第i个行星储存有Ai个单位的燃料。然而,从任何一个其他行星旅行到该行星都需要花费Bi个单位的燃料。不幸的是,燃料是不可再生的,所以当你第二次来到一个行星时,它就没有任何燃料了可以收集。
福克斯从第P个行星出发,当然他们可以立即收集该行星上的燃料。他们然后可以旅行到其他不同的行星。只要他们有足够的燃料,他们可以以任何顺序旅行。最后,他们需要选择一个行星结束旅行,他们的目标是在结束旅行时拥有最多数量的燃料,如果有很多种方法可以实现,他们希望旅行到最多的行星。你能帮助他们么?
数据分析
Input
输入的第一行包含包含两个正整数n,p,表示行星数量,以及出发的行星。
接下来n行每行包含两个整数Ai,Bi,表示第i个行星可以收集的燃料,到达第i个行星需要的燃料。
Output
输出的第一行包含一个整数,表示结束时燃料最多的数量。
第二行包含一个整数,表示在结束是燃料最多的条件下,能够旅行到的行星的最多数量。
Sample Input
5 2
12 12
10 100
8 3
4 5
25 15
Sample Output
25
4
【样例说明】
旅行的顺序:2,3,5,1
解题分析:
1.采集燃料小于需求燃料就必定不会到达
2.初始燃料等于所在行星采集燃料
3.当前燃料大于或等于需求燃料就可以去(可排序实现)
4.采集燃料大于或等于需求燃料必定到达(前提要达到第三点)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000000],b[1000000];
bool t[1000000];
int qt(int l,int r)
{
int i,j,key,c;
bool k;
i=l;j=r;key=b[(l+r)/2];
while (i<=j)
{
while (b[i]<key) i++;
while (b[j]>key) j--;
if (i<=j)
{
c=a[i];a[i]=a[j];a[j]=c;
c=b[i];b[i]=b[j];b[j]=c;
k=t[i];t[i]=t[j];t[j]=k;
i++;
j--;
}
}
if (l<j) qt(l,j);
if (i<r) qt(i,r);
}
int main()
{
int n,p,x,y;
int ans=0,tot=0;
scanf("%d%d",&n,&p);
scanf("\n");
for (int i=1;i<=n;i++)
{
t[i]=true;
scanf("%d%d",&x,&y);
a[i]=x;
b[i]=y;
if (a[i]<b[i]) t[i]=false;
}
tot++;
ans=ans+a[p];
t[p]=false;
a[p]=0;
qt(1,n);
for (int i=1;i<=n;i++)
if (t[i]==true&&ans>=b[i])
{
tot++;
ans=ans+a[i]-b[i];
}
printf("%d\n",ans);
printf("%d\n",tot);
}