http://codeforces.com/contest/369/problem/B

题意 :n, k, l, r, sall, sk,n代表的是n个人,这n个人的总分是sall,每个人的得分大于 l 小于 r ,其中k个人的分数构成了非递增序列,他们的分数总共为sk,让你求出每个人的分数输出即可,只要输出满足要求的一种即可。

思路 :这个题我是比赛完了才做的,据说很多人当时做的时候就因为错在没有特判0上,还有我做的时候越界了,因为没有考虑到如果k=n的话,n-k=0,这样的话sall%n就不对了。就是先看这k个人的,让sk取余k,得到的余数从第一个人开始加1,直到余数没了为止,因为这k个是非递增序列,所以要从前开始加,这样的话剩下的n-k也这样做就行,反正都是符合题意的。

 

#include <iostream>
#include <stdio.h>
using namespace std ;
int main()
{
    int n,k,l,r,sall,sk ;
    while(cin>>n>>k>>l>>r>>sall>>sk)
    {
        int i ;
        if(n == 0)
            continue ;
        if(k == n)
        {
            for(i = 1 ; i <= sk%k ; i++)
                cout<<sk/k+1<<" " ;
            for( ; i <= k ; i++)
                cout<<sk/k <<" ";
        }
        else
        {
            for(i = 1 ; i <= sk%k ; i++)
                cout<<sk/k+1<<" " ;
            for( ; i <= k ; i++)
                cout<<sk/k <<" ";
            n = n-k ;
            sall -= sk ;
            for(i = 1 ; i <= sall%n ; i++)
                cout<<sall/n+1<<" ";
            for( ; i < n ; i++)
                cout<<sall/n<<" " ;
            cout<<sall/n<<endl ;
        }
    }
    return 0 ;
}
View Code

 

posted on 2013-11-30 19:21  枫、  阅读(1392)  评论(0编辑  收藏  举报