原题链接:
https://vjudge.net/problem/Gym-102411H
AC代码:
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <list>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
const int INF = 0x3fffffff;
typedef long long ll;
typedef unsigned long long ull;
void __init__()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
} //head
const int maxn = 1e6 + 10;
ll a[maxn];
ll b[maxn];
ll sum[maxn];
int t;
ll solve(int n)
{
int cnt = 0;
int L = 1, R = t;
int l = 1, r = t;
while (L < R)
{
cnt++;
while (l < r)
{
int mid = (l + r + 1) / 2;
if (sum[mid] - sum[L - 1] <= n)
{
l = mid ;
}
else
r = mid - 1;
}
r = t;
L = l + 1;
l++;
}
if(L==R){
cnt++;
}
return cnt;
}
int main()
{
// __init__();
scanf("%d", &t);
sum[0] = 0;
ll maxx = -1;
for (int i = 1; i <= t; i++)
{
scanf("%lld", &a[i]);
sum[i] += sum[i - 1] + a[i];
maxx = max(maxx, a[i]);
}
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
int d;
cin >> d;
if (d < maxx)
{
printf("Impossible\n");
continue;
}
if (b[d])
{
printf("%lld\n", b[d]);
}
else
{
b[d] = solve(d);
printf("%lld\n", b[d]);
}
}
return 0;
}
二分找到合适的数组序列,普通的遍历会TLE