}
2.(郊游活动)有n名同学参加学校组织的郊游活动,已知学校给这n名同学的郊游总经费为A元,与此同时第i位同学自己携带了Mi元。
为了方便郊游,活动地点提供B(≥n)辆自行车供人租用,租用第j辆自行车的价格为Cj元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。
(第四、五空2.5分,其余3分)
本题采用二分法。
对于区间[l,r],我们取中间点mid并判断租用到自行车的人数能否达到mid。
判断的过程是利用贪心算法实现的。
#includeusingnamespacestd;#defineMAXN1000000
intn,B,A,M[MAXN],C[MAXN],l,r,ans,mid;
boolcheck(intnn){intcount=0,i,j;
i
=
(1)
;
j
=
1;
while(i<=n){
if(
(2)
)
CCFNOIP2016初赛普及组C++语言试题第8页,共9页
count+=C[j]-M[i];
i++;
j++;
}
return
(3)
;
}
voidsort(inta[],intl,intr){
inti=l,j=r,x=a[(l+r)/2],y;while(i<=j){
while(a[i]x)j--;if(i<=j){
y=a[i];a[i]=a[j];a[j]=y;i++;j--;
}
}
if(i}
intmain(){inti;
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((4)){
ans=mid;
l=mid+1;
}else
r=(5);
}
cout<}
CCFNOIP2016初赛普及组C++语言试题第9页,共9页
第二十二届全国青少年信息学奥林匹克联赛初赛
普及组参考答案
一.选择题
DCDCDCBBCADBDADBAACC
二.问题求解
1.72
2.1(2分)11(3分)
三.阅读程序写结果
1.6,1,3
2.13
3.6,5,4,3,2,1,
4.=
四.完善程序
1.
(1)cin.get()
(2)num=c-‘0’或num=c-48
(3)c>=’0’&&c<=’9’或c>=48&&c<=57
(4)num=num*10+c-'0'或?
num=num*10+c-48
(5)num=-num?
或?
return-num
2.
(1)n-nn+1
(2)M[i]或?
M[i]<=C[j]
(3)count<=A
(4)check(mid)
(5)mid-1?