Problem C Pyramid--2020 ICPC Asia Taipei-Hsinchu Regional 滚动数组+思维

Problem C Pyramid--2020 ICPC Asia Taipei-Hsinchu Regional 滚动数组+思维_第1张图片
Problem C Pyramid--2020 ICPC Asia Taipei-Hsinchu Regional 滚动数组+思维_第2张图片

思路

n个球经过某个节点, 有n/2且向上取整个球向左滚 n/2个球向右滚

然后能得到每个点有多少球经过 奇数个球经过,那么当前的开关就是R
偶数个 就是L

默认最后一个球落到0 经过的节点为R的话 落的位置就会向右挪一个位置

n太大 用滚动数组存两层的位置就足够了

代码

#include 
#include
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
int mp[2][10010];
int main()
{
    int t,n,k;
    cin>>t;
    while(t--)
    {
        cin>>n>>k;
        memset(mp,0,sizeof(mp));
        if(n==1)
        {
            cout<<"0"<<endl;
            continue;
        }///坑点  需要特判
        int qian=k-1,ans=1;
        mp[1][1]=k-1;
        for(int i=2;i<n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                mp[i%2][j]=(mp[(i+1)%2][j]/2+mp[(i+1)%2][j-1]/2);///上一层左右两点的一半
                if(mp[(i+1)%2][j]&1)mp[i%2][j]++;///奇数  继承大的那一半
            }
            
            if(qian%2!=0)
            {
                ans++;
            }///向右走
            qian=mp[i%2][ans];
            //cout<
        }
        if(qian%2!=0)
        {
            ans++;
        }
        cout<<ans-1<<endl;
    }
    return 0;
}

你可能感兴趣的:(Problem C Pyramid--2020 ICPC Asia Taipei-Hsinchu Regional 滚动数组+思维)