POJ 3347 (思维题 + 简单计算)

题目: 传送门

题意:有 n 个正方形,倾斜 45 度按顺序放在 x 坐标轴上,然后那些正方形要尽可能的靠近,问排放好之后,你从上往下看,不会被遮住的正方形有哪些。

思路:我们可以算出每个正方形斜放的左右端点的 x 坐标。我们可以枚举前面已经放好的正方形,然后让当前这个正方形和它靠在一起算出当前这个点的左端点的 x 坐标,然后对这些 x 取最大值就是当前这个正方形的左端点的 x 坐标,然后右端点坐标就很容易得到了。我们对输入的边长扩大 sqrt(2) 倍这样就都是整数的运算了,就没有精度误差。

扩大后,正方形的对角线的长度就是 2len 了,然后算左端点的 x 坐标的公式就是, a[ j ].r - abs( a[ j ].len - len),这里的 len 是输入的 len 不需要乘 sqrt(2) 因为,你乘 sqrt(2) 是倾斜 45 度时的长度,要把它变成水平的距离需要除 sqrt(2) 那一乘一除就相当于啥都没做。

最后暴力判断一下当前点是否会被覆盖到, 只有当其他正方形的边长大于你时,你才可能被覆盖。

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <set>
#include <string>
#include <math.h>
#define LL long long
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF 1e20
#define inf LLONG_MAX
#define PI acos(-1)
using namespace std;

const int N = 55;
pair < int, int > a[N];
int len[N];

int main() {
    int n;

    while(scanf("%d", &n) && n) {
        rep(i, 1, n) scanf("%d", &len[i]);

        rep(i, 1, n) {
            a[i].first = 0;
            rep(j, 1, i - 1)
                a[i].first = max(a[i].first, a[j].second - abs(len[i] - len[j]));
            a[i].second = a[i].first + 2 * len[i];
        }

        rep(i, 1, n) {
            rep(j, 1, i - 1) {
                if(len[j] > len[i] && a[j].second > a[i].first) a[i].first = a[j].second;
            }
            rep(j, i + 1, n) {
                if(len[j] > len[i] && a[j].first < a[i].second) a[i].second = a[j].first;
            }
        }

        bool flag = 0;
        rep(i, 1, n) {
            if(a[i].first >= a[i].second) continue;
            if(!flag) printf("%d", i), flag = 1;
            else printf(" %d", i);
        }
        puts("");
    }

    return 0;
}

原文地址:https://www.cnblogs.com/Willems/p/12382785.html

时间: 2024-10-07 03:14:55

POJ 3347 (思维题 + 简单计算)的相关文章

POJ 1852 Ants 思维题 简单题

Ants Description An army of ants walk on a horizontal pole of length l cm, each with a constant speed of 1 cm/s. When a walking ant reaches an end of the pole, it immediatelly falls off it. When two ants meet they turn back and start walking in oppos

poj 1852思维题

背景:挑战程序设计竞赛上的题,好思维.来就想暴力枚举都还没有仔细思考有没有数学规律,n超过20就不适合用2的n次方的算法了. 思路:最短时间十分容易讨论,这里最大时间很巧妙,两只蚂蚁相撞然后各自反向走,可以想成两只蚂蚁绕过,各走各的,这样早最大时间就简单了,就是所有走到端点的时间中最大的. 代码: #include <cstdio> #include <cstdlib> #include <iostream> #include <algorithm> #in

BST POJ - 2309 思维题

Consider an infinite full binary search tree (see the figure below), the numbers in the nodes are 1, 2, 3, .... In a subtree whose root node is X, we can get the minimum number in this subtree by repeating going down the left node until the last leve

读书-算法《程序设计导引及在线实践》-简单计算题2:棋盘上的距离

题目:棋盘上的距离 求国际象棋中王.后.车.象从起始位置到目标位置所需的最少步骤. 行走规则如下: 王:横.竖.斜都可以走,但每步只能走一格. 后:横.竖.斜都可以走,但每步格数不限. 车:横.竖都可以走,不能斜着走,每步格数不限. 象:只能斜着走,格数不限. 我没有下过国际象棋,但题目中这四种角色的行走规则.把题目翻译一下,在一个8*8 的矩阵里面,按照给定的规则从一个点到另一个点的最近路径,好像也不用翻译,题目就是这么说的. 代码实现如下: #include <stdio.h> #incl

[转]POJ的刷题指南(加了超链接的)

网上看到的转过来一下,顺便把题目都加了个超链接,方便刷起~ POJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094) 初期: 一.基本算法:       (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.       (4)递推.       (5)构造法.(po

poj 2683 Ohgas&#39; Fortune 利率计算

水题. 代码: //poj 2683 //sep9 #include <iostream> using namespace std; int main() { int cases; scanf("%d",&cases); while(cases--){ int fund,year,op,ans=-1; scanf("%d%d%d",&fund,&year,&op); while(op--){ int A,B,flag,ch

ACM: Gym 101047K Training with Phuket&#39;s larvae - 思维题

Gym 101047K Training with Phuket's larvae Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Practice Description standard input/output Thai cuisine is known for combining seasonings so that every dish has flavors that are s

数论 --- 简单计算

Power of Cryptography Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 18018   Accepted: 9090 Description Current work in cryptography involves (among other things) large prime numbers and computing powers of numbers among these primes. W

codeforces 848B Rooter&#39;s Song 思维题

http://codeforces.com/problemset/problem/848/B 给定一个二维坐标系,点从横轴或纵轴垂直于发射的坐标轴射入(0,0)-(w,h)的矩形空间.给出点发射的坐标轴,位置,延迟时间,发生碰撞则交换方向.求最后每个点的射出位置. 首先我们观察能得出两个结论,1. 类似蚂蚁爬树枝的问题,相遇只会交换方向,所以最后的射出点集只会因为碰撞而改变动点与射出点的对应关系,而不会增加减少射出点集.2.我们根据其射入位置和延迟时间可以计算出一个值v=pos-time,只有这