CF195B After Training 题解
__1d0h8dp__ · · 题解
题目传送门
思路
本题很水……
根据题意,我们可以看出输出顺序是:从中间开始,先输出左边,再输出右边。
我们可以模拟第一个样例:
我们先找出中间的桶,也就是第二个桶。
对于第二个球,我们要找往左边的一个桶,也就是第一个桶。我们之所以要找这个桶,是因为题目说了,对于距离中间一样的桶,要找最靠左边的一个桶。
对于第三个球,我们要找第三个桶。
对于第四个球,我们要再装到第二个桶里,因为三个桶装的球数量一样。
但是,偶数是另一个情况:
我们找到中间后,要先从右边开始,因为有两个桶离中间的距离一样。当有四个桶时,我们的输出便变成了:
2
3
1
4
为什么是这样呢?因为共有
实现方法
我们要分两类讨论,即当
实现方法其实不难,两种的实现方法基本上一样。可以定义一个
当
当
为什么呢?
前面讲过,当
当现在要选择的桶编号小于
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
int curr=m/2; //从中间开始
if(m%2) curr+=1;
int now=0;
for(int i=1;i<=n;i++){
now++;
printf("%d\n",curr);
if(m%2==1) { //分两类讨论
if(now%2==0) curr+=now;
else curr-=now;
}
else {
if(now%2==0) curr-=now;
else curr+=now;
}
if(curr<1||curr>m){ //重新开始
curr=m/2;
if(m%2) curr+=1;
now=0;
}
}
cout<<endl;
return 0;
}
请勿抄题解!