题目描述
ly 在战场凹分,没吃午饭,饥肠辘辘的他从文具盒里翻出了一袋饼干......
这袋饼干有 n 块,分别称作第 1,2...n 块,第 i 块饼干能提供 w [i] 的饱腹感.
有强迫症的 ly 必须从第 1 块开始吃,然后第 2 块... 直到总饱腹感达到(大于或等于)s 时即停止.
众所周知,万事万物都会随着多种因素的变化而变化,当然 ly 的饱腹感上限 s 也不例外
于是 ly 会询问你 q 次:当他的饱腹感上限为 s [i] 时,他需要吃多少块饼干
输入描述
对于每个测试点,有三行输入
第一行,输入两个正整数 n, q (n, q <= 20'0000),n 表示饼干的数量,q 表示询问的次数.
第二行,输入 n 个正整数 w [i],(w [i] <= 1000) 表示第 i 块饼干的饱腹感.
第三行,输入 p 个正整数 s [i], (s [i] <= 2'0000'0000), 表示 ly 第 i 次询问时的饱腹感上限.
输出描述
仅一行:q 个正整数,第 i 个数表示 ly 第 i 次询问时需要吃的饼干数.
样例输入
Copy to Clipboard
5 3 3 7 9 5 4 5 2 19
样例输出
Copy to Clipboard
2 1 3
/*
* @Description: To iterate is human, to recurse divine.
* @Autor: Recursion
* @Date: 2022-06-05 22:02:51
* @LastEditTime: 2022-06-06 14:09:04
*/
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int maxn = 1e6 + 10;
const int mod = 1e9 + 7;
const int INF = 1e9 + 10;
const int N = 1e6;
int n,q;
LL w[N];
LL s[N];
int sum[N];
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin >> n >> q;
for(int i = 1;i <= n;i ++){
cin >> w[i];
sum[i] += sum[i - 1] + w[i];
}
while(q--){
int x;
cin >> x;
int pos = lower_bound(sum + 1,sum + 1 + n,x) - sum - 1;
cout << pos + 1 << " ";
}
return 0;
}
该博客介绍了一个关于寻找最少饼干数量以达到饱腹感上限的问题,利用二分查找算法进行高效求解。在给定的饼干饱腹感值和多次询问的饱腹感上限后,通过预处理累加数组,快速找到所需答案。
1155

被折叠的 条评论
为什么被折叠?



