站外提,求助!(有点像二分与贪心)
查看原帖
站外提,求助!(有点像二分与贪心)
1141349
zhonghongyi1234楼主2025/1/28 09:11

时间限制: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;
}
2025/1/28 09:11
加载中...