思路:
因为一定有有解,所以可以前k个全部放最大的,超过了sk然后平均一点减,后(n-k)个放最小的,小于sall-sk然后平均一点加,这样就ok了。
感想:
比赛时sb了,自己算了一下最小与最大的范围,然后n=k的时候就除0 RE了,其实最小最大直接用 l,r 就够了。第二题这次挂了,1700又一次破灭了,不过我能感觉的我一步一步的再向1700靠近,没错,就是下次了,1700我来了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <string>
#include <map>
#include <stack>
#include <vector>
#include <set>
#include <queue>
#pragma comment (linker,"/STACK:102400000,102400000")
#define maxn 2005
#define MAXN 100005
#define mod 1000000007
#define INF 0x3f3f3f3f
#define pi acos(-1.0)
#define eps 0.000001
typedef long long ll;
using namespace std;
int n,m,ans,cnt,flag;
int k,l,r,sa,sk;
int a[maxn];
void solve1()
{
int i,j,t,x,y,sum=0;
t=r;
for(i=1; i<=k; i++)
{
a[i]=t;
}
sum=t*k;
x=sum-sk;
while(x>0)
{
for(i=1; i<=k; i++)
{
a[i]--;
x--;
if(x<=0) break ;
}
}
}
void solve2()
{
int i,j,t,x,y,sum=0;
t=l;
for(i=k+1; i<=n; i++)
{
a[i]=t;
}
sum=t*(n-k);
x=sum-(sa-sk);
while(x<0)
{
for(i=k+1; i<=n; i++)
{
a[i]++;
x++;
if(x>=0) break ;
}
}
}
int main()
{
int i,j,t,x,y;
int ma,mi;
while(~scanf("%d%d%d%d%d%d",&n,&k,&l,&r,&sa,&sk))
{
cnt=0;
solve1();
solve2();
sort(a+1,a+n+1);
for(i=n;i>1;i--)
{
printf("%d ",a[i]);
}
printf("%d\n",a[i]);
}
return 0;
}