#10770. 分治算法(NOIP2016)郊游活动

分治算法(NOIP2016)郊游活动

(NOIP2016)郊游活动

有n名同学参加学校组织的郊游活动,已知学校给这n名同学的郊游总经费为A元,与此同时第i位同学自己携带了M_i元。为了方便郊游,活动地点提供B(B≥n)辆自行车供人租用,租用第j辆自行车的价格为C_j元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便服务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。

#include<iostream>
using namespace std;
#define MAXN 1000000
int n,B,A,M[MAXN],C[MAXN],l,r,ans,mid;
bool check(int nn){
    int count=0,i,j;
    i=①;
    j=1;
    while(i<=n){
        if(②)
            count+=C[j]-M[i];
        i++;
        j++;
    }
    return③;
}
void sort(int a[],int l,int r){
    int i=l,j=r,x=a[(l+r)/2],y;
    while(i<=j){
        while(a[i]<x)i++;
        while(a[j]>x)j--;
        if(i<=j){
            y=a[i];a[i]=a[j];a[j]=y;
            i++;j--;
        }
    }
    if(i<r)sort(a,i,r);
    if(l<j)sort(a,l,j);
}
int main(){
    int i;
    cin>>n>>B>>A;
    for(i=1;i<=n;i++)
        cin>>M[i];
    for(i=1;i<=B;i++)
        cin>>C[i];
    sort(M,1,n);
    sort(C,1,B);
    l=0;
    r=n;
    while(l<=r){
        mid=(l+r)/2;
        if(④){
            ans=mid;
            l=mid+1;
        }else
            r=⑤;
    }
    cout<<ans<<endl;
    return 0;
}

①处应填( )。
{{ select(1) }}

  • n-nn+1
  • 1
  • n-nn
  • nn

②处应填( )。
{{ select(2) }}

  • M[j]>C[i]
  • M[i]>C[j]
  • M[i]<C[j]
  • M[j]<C[i]

③处应填( )。
{{ select(3) }}

  • count<=A
  • count>=A
  • count
  • A-count

④处应填( )。
{{ select(4) }}

  • check(mid-1)
  • !check(mid)
  • check(mid)
  • check(mid+1)

⑤处应填( )。
{{ select(5) }}

  • break
  • r=mid+1
  • r=mid
  • r=mid-1