夹取核桃
时间限制:1秒 内存限制:128M
题目描述
小可养的小松鼠正在搬运核桃。小可想要去帮忙,于是拿了一个夹子去搬运核桃。
这个夹子张开和闭合的大小是有限的,最大能够夹取宽度为r的核桃,最小能够夹取宽度为l的核桃。夹取一个宽度为s的核桃就要消耗小可s点能量。现在小可只想用k点能量去搬核桃,太多了小可会累的。现在给出n个核桃的宽度,求小可最多搬运多少个核桃?
输入描述
第一行一个正整数t(1≤t≤100),代表有t组输入。
对于每组输入,第一行四个正整数n,l,r,k(1≤n≤100,1≤l,r,k≤1e9,l≤r),分别代表有n个核桃,夹子只能夹取[l,r]这个区间内宽度的核桃,小可有k点能量。
第二行n个整数ai,代表n个核桃的宽度。
输出描述
对于每组输入,输出小可最多搬运多少个核桃。
样例输入
8
3 1 100 100
50 100 50
6 3 5 10
1 2 3 4 5 6
6 3 5 21
1 2 3 4 5 6
10 50 69 100
20 30 40 77 1 1 12 4 70 10000
3 50 80 30
20 60 70
10 2 7 100
2 2 2 2 2 7 7 7 7 7
4 1000000000 1000000000 1000000000
1000000000 1000000000 1000000000 1000000000
1 1 1 1
1
样例输出
2
2
3
0
0
10
1
1
话不多说,上AC代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin>>t;
int b[t+5],cnt=1;
while(t--){
int n,l,r,k;
scanf("%d %d %d %d",&n,&l,&r,&k);
int a[105];
for(int i=1; i<=n; i++){
scanf("%d",&a[i]);
}
sort(a+1,a+n+1);
int ans=0;
int ll=0,rr=0,flag1=0,flag2=0;
for(int i=1; i<=n; i++){
if(a[i]==l&&flag1==0){
ll=i;
flag1=1;
}
if(a[i]==r){
rr=i;
flag2=1;
}
if(a[i]<l&&flag1==0){
ll=i+1;
}
if(a[i]<r&&flag2==0){
rr=i;
}
}
if(ll==0){
ll=1;
}
while(k-a[ll]>=0&&ll<=rr){
ans++;
k-=a[ll];
ll++;
}
b[cnt++]=ans;
}
for(int i=1;i<cnt;i++){
cout<<b[i]<<endl;
}
return 0;
}