题目大意:斜45度摆放的正方形,靠左摆放,但需与x轴接触,求按顺序摆放,从上方可以观察到的正方形序号。
解题关键:因为题目没让输出与边长有关的东西,所以可以直接将边长设为左端点到中心的距离,来消除误差。求出每个正方形的左端点和右端点之后,然后dp一下求出每个正方形最左端可以被看到的位置和最右端可以被看到的位置。判断一下即可出答案。
#include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath> #include<iostream> using namespace std; typedef long long ll; struct Segment{ int left,right,len; }seg[50]; //此题只看的顺序,所以把边长看成左端点到中心的距离,避免精度问题 int main(){ int n; while(cin>>n,n){ for(int i=0;i<n;i++){ cin>>seg[i].len; seg[i].left=0; for(int j=0;j<i;j++){ seg[i].left=max(seg[i].left,seg[j].right-abs(seg[i].len-seg[j].len)); } seg[i].right=seg[i].left+seg[i].len*2; } //求线段交 for(int i=1;i<n;i++){ for(int j=0;j<i;j++){ if(seg[i].len>seg[j].len&&seg[i].left<seg[j].right) seg[j].right=seg[i].left; else if(seg[i].len<seg[j].len&&seg[i].left<seg[j].right) seg[i].left=seg[j].right; } } for(int i=0;i<n;i++){ if(seg[i].left<seg[i].right) cout<<i+1<< " "; } cout<<"\n"; } return 0; }