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 ; }