牛客小白月賽15A 斑羚飛渡

連接:https://ac.nowcoder.com/acm/contest/917/A

c++

時間限制:C/C++ 1秒,其餘語言2秒
空間限制:C/C++ 131072K,其餘語言262144K
64bit IO Format: %lld

題目描述

題目背景

兩我的之間只能有一個活着 ,這必然是我和你的戰爭——Harry Potter工具

題目描述

水寶寶在看完《斑羚飛渡》這本書後,突發奇想,想到了一個有趣的問題spa

如今峽谷的這邊有n只斑羚,每隻斑羚跳躍的最遠距離爲x[i],斑羚在別人的背上起跳的最遠距離爲y[i],峽谷的兩岸的距離爲s,問在最好狀況下,有幾隻斑羚能夠用別人的背當跳板跳到對岸,但因爲斑羚的先天緣由(主要是太肥),只能把別人當跳板一次



注:本系列題不按難度排序哦

輸入描述:

輸入格式:

第一行n,s 接下來n行,每行2個整數表明x[i],y[i]

輸出描述:

輸出格式:

一行一個整數,表示有幾隻斑羚能夠用別人的背當跳板跳到對岸
示例1

輸入

複製
5 10
6 8
2 100
7 3
1 10
2 5

輸出

複製
2

說明

第一組是第三隻斑羚跳6的距離,第一隻斑羚跳6的距離後從第三隻的背上起跳,再跳8的距離後到達對岸

第二組是第五隻跳2的距離,第二隻跳2的距離後從第五隻的背上起跳,跳100的距離到達對岸(假設對岸無限長,不可能跳出對岸)

備註:

對於100%的數據,n<=1000000;

對於全部數據,s<=1000000000; x[i],y[i]<=s; 不保證x[i]<y[i]


思路:
把羚羊分爲三批,第一批是本身就能跳過去的,第二批是須要別人幫助能跳過去的,第三批是即便別人幫助了也跳不過去的(只能做爲踏板或者被拋棄的,枯了)
不用說第一批了,跳過去就完事了。
第二批,須要第三批或者第二批本身內部來幫助,而後就排個序吧。
這時候考慮到第二批須要第三批羊幫助的底線是啥,起碼第三批羊跳的範圍知足x[j] >= s-y[i]吧,這樣就能踩着他跳過去啦
好比說
2 13
1 12
4 3
第一隻就能踩着知足x[j] >= 13-12=1 的羊 跳過去。

這就是第二種狀況:對當踏板的羊和要跳過去的羊分別排個序,從小到大取過去就行。
第三種狀況也簡單,第三批用不完的(工具人實錘了)直接被淘汰了。
第二批羊沒了當踏板的羊,那就老老實實內部互相「幫助」吧,把剩下的除以二就行。
代碼:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
#define INF 2000000000
#define eps 1e-8
#define pi  3.141592653589793
const LL mod = 1e9+7;
vector<pair<int,int> >v1,v2;
int main()
{
    int n,s;
    int sum1 = 0,sum2 = 0,sum3 = 0;
    //sum1 本身原本就過得去的,sum2須要跟過不去的配合的,sum3兩隻能過得去的相互配合
    scanf("%d %d",&n,&s);
    for(int i = 0 ; i < n ; i++){
        int x,y;
        scanf("%d%d",&x,&y);
        if(x>=s)sum1++;
        else{
            pair<int,int>pii = make_pair(x,y);
            if(x+y >= s){
                v1.push_back(pii);
            }
            else{
                v2.push_back(pii);
            }
        }
    }
    sort(v1.begin(),v1.end());
    sort(v2.begin(),v2.end());
    if(!v2.empty()){
        for(int i = 0 ; i < v1.size() ; i++){
            int z = s - (v1[i].second);
            for(vector<pair<int,int> >::iterator it = v2.begin();it!=v2.end();it++){
                int x_j = it->first;
                if(x_j >= z){
                    sum2++;
                    v2.erase(it);
                    break;
                }
            }
            if(v2.empty()){
                break;
            }
        }
    }
    int last_v1 = v1.size() - sum2;
    if(last_v1 <= 0){
        return printf("%d\n",sum1+sum2),0;
    }//有機會跳過去的羊沒剩餘了
    else{
        sum3 = last_v1/2;
        return printf("%d\n",sum1+sum2+sum3),0;
    }
}
相關文章
相關標籤/搜索