码迷,mamicode.com
首页 > 其他好文 > 详细

[poj3347]Kadj Squares

时间:2018-04-07 22:57:16      阅读:317      评论:0      收藏:0      [点我收藏+]

标签:style   def   iostream   log   else   stream   线段   int   cst   

题目大意:斜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;  
}

 

[poj3347]Kadj Squares

标签:style   def   iostream   log   else   stream   线段   int   cst   

原文地址:https://www.cnblogs.com/elpsycongroo/p/8734590.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!