2020 ICPC Asia Taipei-Hsinchu Regional C - Pyramid (思维)

4 篇文章 0 订阅
4 篇文章 1 订阅

在这里插入图片描述
题意:一个倒三角金字塔的每个节点上都有一个开关,然后开关初始状态都是向左打开,每次当小球经过一个节点时,该节点的开关状态就会改变,从左变为右,或者从右变为左。然后问你第K次放置的小球会从哪个出口离开,对角线线上的点就是出口的位置。

思路:思维的点就是,看上一层和下一层之间的节点状态变化关系,因为只有左右两种方向,那么对于某个节点,假如一个小球经过他x次,那么他左边的顶点就会经过(x+1)/2次,右边就是x/2次,这样我们就可以从开始的节点往下递推一下,得到整张图的某个节点经过的次数,它的第k次的节点状态也就得到了,再模拟一下小球的下落过程就可以了。

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int MAXN = 1e4 + 7;
int mp[MAXN][MAXN];char check[MAXN][MAXN];
int n,k;

inline int read(){
	int X=0; bool flag=1; char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') flag=0; ch=getchar();}
	while(ch>='0'&&ch<='9') {X=(X<<1)+(X<<3)+ch-'0'; ch=getchar();}
	if(flag) return X;
	return ~(X-1);
}


inline int solve(int x,int y){
	if(x + y == n + 1) return y - 1;
	if(mp[x][y] == 1) solve(x + 1,y);
	else solve(x,y + 1);
}
inline void Clear(){
	for(int i = 1;i <= n;i ++)
		for(int j = 1;j + i <= n + 1;j ++) mp[i][j] = 0;
}

int main(){
	int T;
	T = read();
	while(T--){
		// scanf("%d%d",&n,&k);
		n = read(),k = read();
		Clear();
		mp[1][1] = k;//走了k次
		for(int i = 1;i <= n;i ++){
			for(int j = 1;j  + i <= n + 1;j ++){
				mp[i+1][j] += (mp[i][j] + 1) / 2;
				mp[i][j+1] += mp[i][j] / 2;
			}
		}
		for(int i = 1;i <= n;i ++){
			for(int j = 1;i + j <= n + 1;j ++){
				mp[i][j] = mp[i][j] & 1;
			}
		}
		printf("%d\n",solve(1,1));

		
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值