POJ 3347 Kadj Squares 复杂的线段相交问题。这个题目是计算几何的扩大数据运算的典型应用 有时候扩大数据范围避免浮点误差,这个题就是应用

题意 : 给你n个正方形每个正方形斜45度摆放,给你正方形的边长,从上向下看问你能看到哪些正方形。

题解 :

  1. 首先我们发现正方形最大能看到的长度对应着x轴上的对角线的长度。
  2. 发现了这个以后我们就要想办法求出对角线最左和最右边的点的坐标,求坐标的时侯我们发现长度都带着根号2这个时候为了运算的精度我们就给所有的数都乘以一个根号2就可以了。
  3. 画图可以找出求最左最右边坐标的方法。
  4. 这种问题常常考虑能看到的最大情况是什么样子,然后对于这种最大的情况进行判断。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdlib>
using namespace std;
const int maxn = 1005;
struct point {
    int len;
    int rig;
    int lef;
}p[maxn];
int n;
int res[maxn] = {0};
int main () {
    ios_base :: sync_with_stdio(false);
    while (cin >> n && n) {
        for (int i = 1;i <= n; ++ i) {
            cin >> p[i].len;
            p[i].lef = 0;
            for (int j = 1;j < i; ++ j) {
                p[i].lef = max (p[i].lef,p[j].rig - abs (p[i].len - p[j].len));
            }
            p[i].rig = p[i].lef + p[i].len * 2;
            for (int j = 1;j < i; ++ j) {
                if (p[i].len > p[j].len && p[i].lef < p[j].rig) {
                    p[j].rig = p[i].lef;
                }
                else if (p[i].len < p[j].len && p[i].lef < p[j].rig)
                    p[i].lef = p[j].rig;
            }
        }
        int tot = 0;
        for (int i = 1;i <= n; ++ i) {
            if (p[i].lef < p[i].rig) {
                res[tot ++] = i;
            }
        }
        cout << res[0] ;
         for (int i = 1;i < tot; ++ i) {
            cout << ' ' << res[i];
        }
        cout << endl;
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值