题意:一个序列,已知 每个值的范围是[l,r],前k个最大的和是sk,所有的和是s(all) , 要求输出一组满足要求的数据
思路:对于前k个和sk,均摊,然后多出来的部分给前面,同理,对后n-k个均摊,多出来的部分也给 后面 的 前面。
数据分析:1 ≤ n, k, l, r ≤ 1000; l ≤ r; k ≤ n; 1 ≤ sk ≤ sall ≤ 106
复杂度分析: 很低吧
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[2000];
int main(void)
{
int n,k,l,r,sum,s;
cin >> n >> k>> l>> r>> sum >>s;
int sub=sum-s;
int r1=n-k;
if(r1)
{
int x=sub/r1;
for(int i=k+1; i<=n; i++)
a[i]=x;
int ans=sub % r1;
for(int i=k+1; i<=n; i++)
{
if(ans >0)
a[i]++,ans--;
else if(ans==0)
break;
}
}
if(k)
{
int x=s/k;
int ans;
ans=s%k;
for(int i=1; i<=k; i++)
a[i]=x;
for(int i=1; i<=k; i++)
{
if(ans > 0)
a[i]++,ans--;
else if(ans==0)
break;
}
}
for(int i=1; i<=n; i++)
printf("%d ",a[i]);
puts("");
}