CF195B After Training题解

· · 题解

不难发现,因为一开始所有框都是空的,所以第一次球总是放在最中间的框,此时需要分 m 的奇偶性讨论。

当 m 为奇数时,中间的框的编号应为 (m+1) \div 2;

当 m 为偶数时,中间的框的编号应该为 m \div 2。

因为 C++ 除法自动向下取整,所以中间值 mid 在代码中直接赋值为(m+1)/2即可。

接下来直接按照左右左右的方式放,答案 ans 从右边移到左边的代码为ans=m-ans,从左边移到右边是ans=m-ans+1。

代码:

#include<bits/stdc++.h>
int n,m,ans;
using namespace std;
int main()
{   
    cin>>n>>m;
    int mid=(m+1)/2;//中间值
    ans=mid;//第一个答案一定是中间值 
    for(int i=0;i<n;i++){
        cout<<ans<<endl;//输出答案
        if(ans==m)ans=mid;//当答案和m相同时答案是中间值 
        else if(ans<mid)ans=m-ans+1;//当答案比中间值小(在左边)时要移到右边 
        else ans=m-ans;//否则移到左边 
    }
    return 0;
}