Valera loves to participate in competitions. Especially in programming contests. Today he has participated in the contest with his team, consisting of n students (including Valera). This contest was an individual competition, so each student in the team solved problems individually.
After the contest was over, Valera was interested in results. He found out that:
- each student in the team scored at least l points and at most r points;
- in total, all members of the team scored exactly sall points;
- the total score of the k members of the team who scored the most points is equal to exactly sk; more formally, if a1, a2, ..., an is the sequence of points earned by the team of students in the non-increasing order (a1 ≥ a2 ≥ ... ≥ an), then sk = a1 + a2 + ... + ak.
However, Valera did not find out exactly how many points each of n students scored. Valera asked you to recover any distribution of scores between the students of the team, such that all the conditions above are met.
The first line of the input contains exactly six integers n, k, l, r, sall, sk (1 ≤ n, k, l, r ≤ 1000; l ≤ r; k ≤ n; 1 ≤ sk ≤ sall ≤ 106).
It's guaranteed that the input is such that the answer exists.
Print exactly n integers a1, a2, ..., an — the number of points each student scored. If there are multiple solutions, you can print any of them. You can print the distribution of points in any order.
5 3 1 3 13 9
2 3 2 3 3
5 3 1 3 15 9
3 3 3 3 3
题意:
给出n,k,l,r,sall,sk。求一序列满足条件:
1、该序列有n个数字组成,且序列总和等于sall;
2、该序列的n个数均由l到r的数字组成;
3、这个序列降序排序后,前k个数和为sk;
满足序列可能有多个,输出其中一个即可。
思路:
1.先将前k个数赋值为r,若k*r>sk,则逐一减一直到等于sk;
2.剩下的n-k个数赋值为l,若(n-k)*l<sall,则逐一加一直到等于sall-sk;
AC:
#include<stdio.h>
int num[1005];
int main()
{
int n,k,l,r,sa,sk,sum,ans;
scanf("%d%d%d%d%d%d",&n,&k,&l,&r,&sa,&sk);
for(int i=1;i<=n;i++)
{
if(i<=k) num[i]=r;
if(i>k) num[i]=l;
}
sum=r*k;
ans=1;
while(sum!=sk)
{
if(ans==(k+1)) ans=1;
num[ans++]--;
sum--;
}
sum=(n-k)*l;
ans=k+1;
while(sum!=(sa-sk))
{
if(ans==(n+1)) ans=k+1;
num[ans++]++;
sum++;
}
for(int i=1;i<=n;i++)
{
printf("%d",num[i]);
i==n?printf("\n"):printf(" ");
}
return 0;
}
本文介绍了一个简单的算法,用于解决特定条件下学生团队比赛成绩的分配问题。条件包括:每个学生的得分范围、团队总分及最高分学生的分数总和。通过调整最高分与最低分,确保满足所有限制条件。
936

被折叠的 条评论
为什么被折叠?



