标签:11 School 38 int x1 立方体 x2 y1 y2
比赛链接:
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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。