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