The 2020 ICPC Asia Taipei-Hsinchu Site Programming Contest-C题 Pyramid

题意:
一个n*n的矩阵,取其上三角矩阵,每个点的初值为L,左上角为起点,每次在起点放入一个球,如果当前点为L,则向下走,若为R,则向右走,则之后L会变成R,或R变成L。
问第k个球最后落入哪里
题解:
假如起点经过了m个点,那么下面的点就经过(m+1)/2次,右边的点经过m/2次,以此类推,这样就可以求出k-1个球之后每个点的状态,然后模拟一边就行。
代码:

#include
#define fi first
#define se second
#define debug printf(" I am here\n");
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
const ll INF=0x3f3f3f3f3f3f3f3f;
const int maxn=1e4+5,inf=0x3f3f3f3f,mod=1e9+7;
const double eps=1e-10;
int dp[maxn][maxn];
int n,k;
void dfs(int x,int y){
    if(x+y==n+1){
        printf("%d\n",y-1);
        return ;
    }
    if(dp[x][y]){
        dfs(x,y+1);
    }else{
        dfs(x+1,y);
    }
}
int main(){
    int _;scanf("%d",&_);
    while(_--){
        scanf("%d%d",&n,&k);
//        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++){
            for(int j=1;i+j<=n+1;j++){
                dp[i][j]=0;
            }
        }
        dp[1][1]=k-1;
        for(int i=1;i<=n;i++){
            for(int j=1;i+j<=n+1;j++){
                dp[i+1][j]+=(dp[i][j]+1)/2;
                dp[i][j+1]+=dp[i][j]/2;
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;i+j<=n+1;j++){
                dp[i][j]%=2;
            }
        }
        dfs(1,1);
    }
    return 0;
}

你可能感兴趣的:(The 2020 ICPC Asia Taipei-Hsinchu Site Programming Contest-C题 Pyramid)