連接:https://ac.nowcoder.com/acm/contest/917/A
c++
兩我的之間只能有一個活着 ,這必然是我和你的戰爭——Harry Potter工具
水寶寶在看完《斑羚飛渡》這本書後,突發奇想,想到了一個有趣的問題spa
輸入格式:
第一行n,s 接下來n行,每行2個整數表明x[i],y[i]
輸出格式:
一行一個整數,表示有幾隻斑羚能夠用別人的背當跳板跳到對岸
對於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; } }