题解:P5956 [POI 2017] Podzielno
pengziyippp · · 题解
题目大意
给出一个
思路简述
水题但赛时没有想出来,果然我是废物捶石了。
思考观察在
由于我们知道,在
这里我们可以观察到
如何控制为
再考虑如何最大化,我们容易想到将数字大的放前面,小的放后面,最后判断一下位置输出答案即可。
完结撒花。
代码实现
马蜂良好。
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int a[N], sum[N];
signed main(){
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
int b, q; cin >> b >> q;
int summ = 0, maxx = 0;
for (int i = 0; i <= b - 1; i ++ ) {
cin >> a[i];
summ += (a[i] * i); // 统计和
maxx += a[i]; // 统计出最多有多少位
}
if (summ % (b - 1)) a[summ % (b - 1)] --, maxx --; // 处理掉多余的数
sum[0] = a[0];
for (int i = 1; i <= b - 1; i ++ ) {
sum[i] = sum[i - 1] + a[i];
} // 计算到数字i有多少个数位
for (int i = 1; i <= q; i ++ ) {
int k; cin >> k;
k ++; // 处理第0位
if (k > maxx) {
cout << -1 << "\n"; // 判断是否存在
} else {
cout << lower_bound(sum, sum + b - 1, k) - sum << "\n"; // 找出答案
}
}
}