问题 K: 水果传送

时间限制: 1 Sec 内存限制: 128 MB
[状态] [提交] [命题人:admin]
题目描述
联欢会开始了,同学们按对应的组别已整齐安静的就坐。此时小Z发现为同学们准备的水果还没有派发。各小组已紧密的连成了一排,于是他想了个办法,从两端将水果一个一个传送给各组,直到满足各组水果要求个数为止。假设每秒他只能在两端各传送一个水果,求T秒后各组中的水果数。
传送办法是:各组拿到水果后都向中间方向的相邻组传送(最中间的不用传),直到相邻组满足要求为止。举例:小组数M=5,各组要求水果数K=4。
第1秒

输入
输入三个正整数,分别是组数M,每组需要的水果数K,时间T,它们的范围[1…100000]。
数据保证M为奇数,K为偶数。T<=M*K/2。
输出
输出传送T秒后,各组别的水果数。
样例输入 Copy
5 4 5
样例输出 Copy
1 2 4 2 1

分析,就是将它分成好几种情况。1,还没到中间,2,到中间了但是中间数没有超过k值,3,到中间了 超过k。
上码;


```csharp
#include <bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int main() {
    int n,i,j,m,s,c,t,k,t1,t2;
    int a[100001];
    int b;
    scanf("%d%d%d",&m,&k,&t);
    n=m/2+1;//中间数
    c=t-m/2;//剩下的时间
    b=k/2;//半对半时间
    for(i=1; i<=n; i++)
        a[i]=0;
    if(t<n) { //ok
        for(i=1; i<=t; i++) {
            a[i]=1;
            a[m-i+1]=1;
        }
        for(i=1; i<=m; i++) {
            if(i<=t)
                printf("%d ",a[i]);
            else if(i>=m-t+1)
                printf("%d ",a[i]);
            else printf("0 ");
        }
    } else if(t>=n) {
        for(i=1; i<n; i++)
            a[i]=1;
        if(c*2<=k)//(t-m/2)*2为剩下的;
            a[n]=c*2;//ok
        else if(c*2>k){
            t=c-k/2;
            a[n]=k;
            for(i=n-1;i>=1;i--){
                if(t==0) break;
                while(a[i]<k){
                    a[i]++;
                    t--;
                    if(t==0) break;
                }
            }
        }
        for(i=1; i<=m; i++) {
            if(i<=n)
                printf("%d ",a[i]);
            else if(i>n)
                printf("%d ",a[m-i+1]);
        }
    }
    return 0;
}