纪中暑假培训:Data 0 题目一 【五校联考2day1】任务 (Standard IO)

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);
}

猜你喜欢

转载自blog.csdn.net/g2523054231/article/details/80933584