可以确定分组的方式是贪心的放
先算出前缀和,然后用一个自动机pre[i]表示当和是i个任务时,事实上只能取pre[i]个,因为事物不能断开
直接把1-1e6的答案全算出来,由于调和级数,总复杂度nlogn
#include<bits/stdc++.h> using namespace std; #define N 2000005 #define ll long long int n,a[N],sum[N],pre[N],ans[N]; int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; int mx=0,p1=0,p2=0; for(int i=1;i<=n;i++){ sum[i]=sum[i-1]+a[i]; p2=p1+a[i]; for(int j=p1+1;j<=p2-1;j++) pre[j]=p1; p1=p2; pre[p2]=p2; mx=max(mx,a[i]); } for(int i=sum[n]+1;i<=2*sum[n];i++) pre[i]=sum[n]; for(int i=1;i<=sum[n];i++){ if(mx>i){ans[i]=-1;continue;} int p=0; while(p<sum[n]){ p+=i; p=pre[p]; ans[i]++; } } int q;cin>>q; while(q--){ int t;scanf("%d",&t); if(ans[t]==-1)puts("Impossible"); else cout<<ans[t]<<' '; } }