Gym - 101190J[暴力模拟求重心]

题目链接:https://vjudge.net/problem/Gym-101190J

 

解题思路:

这题直接暴力模拟求每层的重心(质量和位置有关),看前i层的物体重心是否落在第i+1层的实体上,没有的话就一定倒了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int mx = 1e4 + 10;
int n, w, h, m;
int cnt[mx];
int suf[mx];
double dx[mx],dy[mx],sum[mx];
double midx[mx],midy[mx];
int l[mx],r[mx];
bool vis[mx/2][mx];
int main()
{
    freopen("jenga.in", "r", stdin);
    freopen("jenga.out", "w", stdout);
    scanf("%d%d%d%d",&n,&w,&h,&m);
	for(int i=h;i;i--){
		sum[i] = 1.0*n*n/2;
		cnt[i] = n,suf[i] = suf[i+1] + n;
		dy[i] = dx[i] = 1.0*n/2;
		midx[i] = (dx[i]*(suf[i]-suf[i+1])+midx[i+1]*suf[i+1])/suf[i];
		midy[i] = (dy[i]*(suf[i]-suf[i+1])+midy[i+1]*suf[i+1])/suf[i];
		l[i] = 1,r[i] = n;
	}
	int a,b;
	for(int i=1;i<=m;i++){
		scanf("%d%d",&a,&b);
		sum[a] -= b - 0.5,cnt[a]--;
		vis[a][b] = 1;
		if(a&1) dx[a] = sum[a] / cnt[a];
		else dy[a] = sum[a] / cnt[a];
		while(vis[a][l[a]]&&l[a]<=r[a]) l[a]++;
		while(vis[a][r[a]]&&l[a]<=r[a]) r[a]--;
		for(int j=a;j;j--){
			suf[j]--;
			midx[j] = (dx[j]*(suf[j]-suf[j+1])+midx[j+1]*suf[j+1])/suf[j];
			midy[j] = (dy[j]*(suf[j]-suf[j+1])+midy[j+1]*suf[j+1])/suf[j];
			if(j!=h){
				if(j&1){
					if(midx[j+1]<=l[j]-1||midx[j+1]>=r[j]) 
					return 0*printf("yes\n%d\n",i);
				}else{
					if(midy[j+1]<=l[j]-1||midy[j+1]>=r[j]) 
					return 0*printf("yes\n%d\n",i);	
				}
			}
		}
	}
    return 0*puts("no");
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值