其他分享
首页 > 其他分享> > School Personal Contest #1 (Winter Computer School 2010/11) - Codeforces Beta Round #38 (ACM-ICPC Ru

School Personal Contest #1 (Winter Computer School 2010/11) - Codeforces Beta Round #38 (ACM-ICPC Ru

作者:互联网

比赛链接:

https://codeforces.com/contest/38

D. Vasya the Architect

题目大意:

有 \(n\) 个立方体,给了每一个立方体在 \(xoy\) 面上投影的对角坐标,按照给定的顺序,依次往上叠立方体,问在保持平衡不到的状态下,最多能叠多少个立方体。

思路:

对于第 \(i\) 个立方体,需要判断的是它的重心是否落在下面立方体的投影内,即求重心公式,判断是否能保持平衡。
\(k\) 个物品的叠加后的重心落在 \(( (x[1] * w[1] + x[2] * w[2] + ... + x[k] * w[k]) / (w[1] + w[2] + ... + w[k]), (y[1] * w[1] + y[2] * w[2] + ... + y[k] * w[k]) / (w[1] + w[2] + ... + w[k]))\)。
\(w[i]\) 为第 \(i\) 个物品的重量,\(x[i]\) 为第 \(i\) 个物品重心的横坐标,\(y[i]\) 为第 \(i\) 个物品重心的纵坐标。

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 110;
struct node{
	double x1, y1, x2, y2, x, y, w;
}a[N];
int n;
void solve(){
	for (int i = 0; i < n; i ++ ){
		double x = a[i].x * a[i].w, y = a[i].y * a[i].w, w = a[i].w;
		for (int j = i - 1; j >= 0; j -- ){
			if (x / w < a[j].x1 || x / w > a[j].x2 || y / w < a[j].y1 || y / w > a[j].y2){
				cout << i << "\n";
				return;
			}
			x += a[j].x * a[j].w;
			y += a[j].y * a[j].w;
			w += a[j].w;
		}
	}
	cout << n << "\n";
}
int main(){
	cin >> n;
	for (int i = 0; i < n; i ++ ){
		cin >> a[i].x1 >> a[i].y1 >> a[i].x2 >> a[i].y2;
		a[i].x = (a[i].x1 + a[i].x2) / 2.0;
		a[i].y = (a[i].y1 + a[i].y2) / 2.0;
		if (a[i].x1 > a[i].x2) swap(a[i].x1, a[i].x2);
		if (a[i].y1 > a[i].y2) swap(a[i].y1, a[i].y2);
		double t = a[i].y2 - a[i].y1;
		a[i].w = t * t * t;
	}
	solve();
	return 0;
}

标签:11,School,38,int,x1,立方体,x2,y1,y2
来源: https://www.cnblogs.com/Hamine/p/16178130.html