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<bits/stdc++.h>
#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;
}

浙公网安备 33010602011771号