zoukankan      html  css  js  c++  java
  • [poj3347]Kadj Squares

    题目大意:斜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<<"
    ";
        }
        return 0;  
    }
  • 相关阅读:
    x+=y与x=x+y有什么区别?
    Linux下带宽流量工具iftop实践
    使用pinyin4j实现汉字转拼音
    Spring整合Velocity模版引擎
    Json工具类库之Gson实战笔记
    腾讯移动分析 签名代码示例
    Docker搭建Portainer可视化界面
    maven 打包 spring boot 生成docker 镜像
    Mysql 为什么要选择 B+Tree
    idea 添加 注释 配置
  • 原文地址:https://www.cnblogs.com/elpsycongroo/p/8734590.html
Copyright © 2011-2022 走看看