简单几何(线段覆盖) POJ 3347 Kadj Squares
生活随笔
收集整理的這篇文章主要介紹了
简单几何(线段覆盖) POJ 3347 Kadj Squares
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?
題目傳送門
題意:告訴每個矩形的邊長,它們是緊貼著的,問從上往下看,有幾個還能看到。
分析:用網上猥瑣的方法,將邊長看成左端點到中心的距離,這樣可以避免精度問題。然后先求出每個矩形的左右端點,然后如果被覆蓋那么將端點更新到被覆蓋的位置。最后看那些更新后左端點小于右端點,這些是可以看得到的。
?
/************************************************
* Author :Running_Time
* Created Time :2015/10/28 星期三 11:48:32
* File Name :POJ_3347.cpp************************************************/#include <cstdio>
#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstring>
#include <cmath>
#include <string>
#include <vector>
#include <queue>
#include <deque>
#include <stack>
#include <list>
#include <map>
#include <set>
#include <bitset>
#include <cstdlib>
#include <ctime>
using namespace std;#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
typedef long long ll;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const double EPS = 1e-10;
const double PI = acos (-1.0);
struct Square {int l, r, len;
}s[55];int main(void) {int n;while (scanf ("%d", &n) == 1) {if (!n) break;for (int i=1; i<=n; ++i) {scanf ("%d", &s[i].len);s[i].l = 0;for (int j=1; j<i; ++j) {int tmp;if (s[i].len <= s[j].len) {tmp = s[j].l + s[j].len + s[i].len;}else {tmp = s[j].l + s[j].len * 3 - s[i].len;}if (tmp > s[i].l) s[i].l = tmp;}s[i].r = s[i].l + s[i].len * 2;}for (int i=2; i<=n; ++i) {for (int j=1; j<i; ++j) {if (s[j].len < s[i].len && s[j].r > s[i].l) {s[j].r = s[i].l;}else if (s[j].len > s[i].len && s[j].r > s[i].l) {s[i].l = s[j].r;}}}for (int i=1; i<=n; ++i) {if (s[i].l < s[i].r) {printf ("%d ", i);}}puts ("");}//cout << "Time elapsed: " << 1.0 * clock() / CLOCKS_PER_SEC << " s.\n";return 0;
}
轉載于:https://www.cnblogs.com/Running-Time/p/4924110.html
總結
以上是生活随笔為你收集整理的简单几何(线段覆盖) POJ 3347 Kadj Squares的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: qq个性签名表白
- 下一篇: 中国移动一条短信多少钱