POJ 1083 Moving Tables 思路 难度:0

http://poj.org/problem?id=1083

  这道题题意是有若干段线段,每次要求线段不重叠地取,问最少取多少次.

  因为这些线段都是必须取的,所以需要让空隙最小

思路:

  循环直到线段全部取完,对于某个刚取得线段ij,下一个线段km取起点k尽量靠近j且满足k>j的.记录循环次数cnt,答案是cnt*10

注意:

  房间是相对的,也就是说对于奇数房间号,利用的走廊相当于对应的偶数房间号开始的那一段路程,

  一段路程的开头不能是另外一段路程的结尾.

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 400;
int n;
typedef pair<int,int> P;
P a[maxn];
bool vis[maxn];
int main()
{
    freopen("data.in","r",stdin);
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i = 0;i < n;i++)
        {
            scanf("%d%d",&a[i].first,&a[i].second);
            if(a[i].first&1)a[i].first++;
            if(a[i].second&1)a[i].second++;
            if(a[i].first>a[i].second)swap(a[i].first,a[i].second);
        }
        sort(a,a+n);
        memset(vis,false,sizeof(vis));
        int cnt = 0;
        for(int st = 0;st < n;st++)
        {
            if(vis[st])continue;
            vis[st] = true;
            cnt++;
            for(int i = st + 1,e = a[st].second;i < n;i++)
            {
                if(a[i].first <= e || vis[i])continue;
                vis[i] = true;
                e = a[i].second;
            }
        }
        printf("%d\n",cnt * 10);
    }
    return 0;
}
时间: 2024-10-10 13:24:24

POJ 1083 Moving Tables 思路 难度:0的相关文章

POJ 1083 Moving Tables

题意:一个建筑物里有400个房间,房间都在一层里,在一个走廊的两侧,如图,现在要搬n张桌子,告诉你每张桌子是从哪个屋搬到哪个屋,搬桌子的线路之间不可以有重叠,问最少搬几次. 解法:贪心.一开始觉得只要排个序,然后按顺序一次一次的分配就可以了……但是wa了……百度之后知道只要看哪块地的使用次数最多就是答案……于是A了之后出随机数据对拍,发现确实一开始的贪心是错的……嘤嘤嘤 代码: #include<stdio.h> #include<iostream> #include<alg

poj 1579 Moving Tables(水)

Description The Recaman's sequence is defined by a0 = 0 ; for m > 0, a m = a m−1 − m if the rsulting a m is positive and not already in the sequence, otherwise a m = am−1 + m. The first few numbers in the Recaman's Sequence is 0, 1, 3, 6, 2, 7, 13, 2

poj 杂题 - 1083 Moving Tables

这道题最主要的是看懂题目即可.我们需要算出搬动桌子的最短时间,根据这个图可以知道不同房间占用同一走廊. 这道题里1-4,2 -3显然占用同一走廊,但是2-3 和 4-5也占用了房间4和房间3的那个走廊,所以注意这个数据的最短时间是20,不是10.搞清楚这个就好做了,我们可以将房间偶数/2,奇数/2+1,这样2-3变成了1-2,4-5变成了2-3,自然占用了走廊. #include<stdio.h> #include<string.h> #define max(x,y)(x>y

POJ 3984 迷宫问题 bfs 难度:0

http://poj.org/problem?id=3984 典型的迷宫问题,记录最快到达某个点的是哪个点即可 #include <cstdio> #include <cstring> #include <queue> using namespace std; const int maxn=10; const int inf=0x3fffffff; struct pnt { int x,y; pnt(){x=y=0;} pnt(int tx,int ty){x=tx,y

POJ 1321 棋盘问题 dfs 难度:0

http://poj.org/problem?id=1321 注意是在'#'的地方放棋子 矩阵大小不过8*8,即使是8!的时间复杂度也足以承受,可以直接dfs求解 dfs时标注当前点的行和列已被访问,接着搜索行列都未被访问的新点,注意搜索完毕之后标注当前点的行和列未被访问 #include <cstdio> #include <cstring> using namespace std; int n,k; char maz[8][9]; int e[8][8],len[8]; boo

POJ 1503 Integer Inquiry 大数 难度:0

题目链接:http://poj.org/problem?id=1503 1 import java.io.*; 2 import java.math.BigInteger; 3 import java.util.Scanner; 4 5 public class Main { 6 public static void main(String []args) throws IOException{ 7 Scanner scanner=new Scanner(System.in); 8 BigInt

POJ 2262 Goldbach&#39;s Conjecture 数学常识 难度:0

题目链接:http://poj.org/problem?id=2262 哥德巴赫猜想肯定是正确的 思路: 筛出n范围内的所有奇质数,对每组数据试过一遍即可, 为满足b-a取最大,a取最小 时空复杂度分析: 在1e6内约有8e4个奇质数,因为a <= b,时间复杂度在T*4e4+1e6等级.一般T为1e3,足以承受 空间复杂度为1e6,足以承受 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm&g

POJ 3006 Dirichlet&#39;s Theorem on Arithmetic Progressions 素数 难度:0

http://poj.org/problem?id=3006 #include <cstdio> using namespace std; bool pm[1000002]; bool usd[1000002]; bool judge(int x) { if(usd[x])return pm[x]; usd[x] = true; if(x == 2) return pm[x] = true; if(((x & 1) == 0) || (x < 2))return pm[x] =

poj1083 Moving Tables

Moving Tables Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 26782   Accepted: 8962 Description The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in the following figure. The floor has 200