时间限制:1秒 内存限制:128M 题目描述 新年的脚步越来越近,小可满心欢喜地盼着过年,而最让他期待的,就是妈妈精心准备的年夜饭。
今年,妈妈准备了各式各样的美食,每一种都独具风味。
已知妈妈准备了 n 种食物,每一种食物都有它独特的美味程度,第 i 种食物的美味程度用 a i 来表示。妈妈说,一顿完美的年夜饭,所有食物的美味程度总和必须达到 x,这样才能将新年的氛围拉满。
小可好胜心起,暗自琢磨:要是由自己来挑选食物,最少需要选多少种食物呢?
输入描述 第一行:输入两个整数
n 和 q ,表示食物种类数和查询次数。
第二行:输入n个正整数,表示美味程度 a i 。
接下来 q 行:每行输入一个正整数 x,表示要达到的总和 x。
输出描述 对于每次查询,输出最少选择多少种食物,如果达不到 x ,则输出 -1。
输入样例 8 7 4 3 3 1 1 4 5 9 1 10 50 14 15 22 30 输出样例 1 2 -1 2 3 4 8 数据范围 30%的数据下:
1≤n,q≤10 3 ,1≤a i ≤10 4 ,1≤x≤10 9
100%的数据下:
1≤n,q≤1.5∗10 5 ,1≤a i ≤10 4 ,1≤x≤10 9
code:
#include<bits/stdc++.h>
using namespace std;
const int N=1.5*1e5;
int n,q,x,a[N],sum;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>q;
for(int i=1;i<=n;++i){
cin>>a[i];
sum+=a[i];
}
sort(a+1,a+1+n);
for(int i=1;i<=n;++i){
a[i]+=a[i-1];
}
while(q--){
cin>>x;
if(x>sum){
cout<<"-1";
}
else if(x==sum){
cout<<n;
}
else{
int s=0;
int l=1,r=n;
while(l<r){
int mid=l+r<<1;
if(a[r]-a[mid-1]<x){
r=mid-1;
}
else{
l=mid;
}
}
cout<<l;
}
cout<<'\n';
}
return 0;
}