nyoj 220——推桌子——————【贪心】

推桌子

时间限制:1000 ms  |  内存限制:65535 KB

难度:3

描述
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 rooms each on the north side and south side along the corridor. Recently the Company made a plan to reform its system. The reform includes moving a lot of tables between rooms. Because the corridor is narrow and all the tables are big, only one table can pass through the corridor. Some plan is needed to make the moving efficient. The manager figured out the following plan: Moving a table from a room to another room can be done within 10 minutes. When moving a table from room i to room j, the part of the corridor between the front of room i and the front of room j is used. So, during each 10 minutes, several moving between two rooms not sharing the same part of the corridor will be done simultaneously. To make it clear the manager illustrated the possible cases and impossible cases of simultaneous moving. 

For each room, at most one table will be either moved in or moved out. Now, the manager seeks out a method to minimize the time to move all the tables. Your job is to write a program to solve the manager‘s problem.
输入
The input consists of T test cases. The number of test cases ) (T is given in the first line of the input file. Each test case begins with a line containing an integer N , 1 <= N <= 200, that represents the number of tables to move. 
Each of the following N lines contains two positive integers s and t, representing that a table is to move from room number s to room number t each room number appears at most once in the N lines). From the 3 + N -rd 
line, the remaining test cases are listed in the same manner as above.
输出
The output should contain the minimum time in minutes to complete the moving, one per line.
样例输入
3
4
10 20
30 40
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50
样例输出
10
20
30

题目大意:让你搬桌子,但是走廊太窄,某段走廊只能一次移动一个桌子,两个相对的房间对应同一个走廊号。每次搬运花费10分钟,问最少需耗费多少分钟。其实问的就是次数。

解题思路:方法1:其实就是重叠度的问题。重叠度越高,需要的次数就越多。可以让每次搬运经过的走廊号对应的变量都自加,最后统计所有走廊号对应变量大小,其中最大的就是需要搬运的最少次数。方法2:按照选择不相交区间的思想来做。但是这个需要按照左端点从小到大排序,然后挑出第一个没选择过的区间的右端点作为比较值,以挑出的那个区间为衡量选出所有不相交的区间,表示需搬运一次。然后重复挑选。最后挑选了几次,表示需要搬运几次。

1:
//方法1
#include<bits/stdc++.h>
using namespace std;
int corridor[210];
int main(){
    int t,n,m,i,j,k,cnt,tmp,a,b;
    scanf("%d",&t);
    while(t--){
        memset(corridor,0,sizeof(corridor));
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d%d",&a,&b);
            a=(a+1)/2,b=(b+1)/2;
            if(a>b){
                tmp=a;
                a=b;
                b=tmp;
            }
            for(j=a;j<=b;j++){
                corridor[j]++;
            }
        }
        cnt=0;
        for(i=1;i<=202;i++){
            cnt>corridor[i]? :cnt=corridor[i];
        }
        cout<<cnt*10<<endl;
    }
    return 0;
}

  2:

 //方法2
#include<bits/stdc++.h>
using namespace std;
struct SEG{
    int left,right;
    int used;
    SEG(){
        used=0;
    }
}seg[500];
bool cmp(SEG a,SEG b){
    if(a.left!=b.left)
        return a.left<b.left;
}
int main(){
//    freopen("Input.txt","r",stdin);
//    freopen("OUT.txt","w",stdout);
    int t,n,m,i,j,k,num,cnt,a,b,pos;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        for(i=0;i<n;i++){
            scanf("%d%d",&a,&b);
            a=(a+1)/2,b=(b+1)/2;
            a>b?a=a+b,b=a-b,a=a-b:0;
            seg[i].left=a,seg[i].right=b;
        }
        sort(seg,seg+n,cmp);
        num=0,cnt=0;
        while(cnt<n){
            for(i=0;i<n;i++){
                if(seg[i].used==0){
                    pos=i;
                    break;
                }
            }
            seg[pos].used=1;
            cnt++;
            num++;
            for(i=1;i<n;i++){
                if(!seg[i].used){
                    if(seg[pos].right<seg[i].left){
                        pos=i;
                        seg[i].used=1;
                        cnt++;
                    }
                }
            }
        }
        cout<<num*10<<endl;
        for(i=0;i<500;i++)
            seg[i].used=0;
    }
    return 0;
}

  


时间: 2024-10-11 19:41:54

nyoj 220——推桌子——————【贪心】的相关文章

poj1083,nyoj220推桌子 贪心

#include <stdio.h><span style="font-family: Arial, Helvetica, sans-serif;">//注意两点,桌子可能从编号高的房间推到编号低的房间.如果2 3 ,4 5也是要分两次进行.因为3和4在同一走廊.</span> #include <string.h> #include <algorithm> using namespace std; struct node {

推桌子

推桌子 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 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 rooms each on the north side and south side along the corridor. Rec

NYOJ 203 三国志(Dijkstra+贪心)

三国志 时间限制:3000 ms  |  内存限制:65535 KB 难度:5 描写叙述 <三国志>是一款非常经典的经营策略类游戏.我们的小白同学是这款游戏的忠实玩家.如今他把游戏简化一下,地图上仅仅有他一方势力,如今他仅仅有一个城池,而他周边有一些无人占的空城,可是这些空城中有非常多不同数量的同种財宝. 我们的小白同学虎视眈眈的看着这些城池中的財宝. 依照游戏的规则.他仅仅要指派一名武将攻占这座城池,里面的財宝就归他全部了.只是一量攻占这座城池,我们的武将就要留守.不能撤回.由于我们的小白手

[nyoj]会场安排问题-贪心

会场安排问题 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工作就是安排学校小礼堂的活动,每个时间最多安排一个活动.现在小刘有一些活动计划的时间表,他想尽可能的安排更多的活动,请问他该如何安排. 输入 第一行是一个整型数m(m<100)表示共有m组测试数据.每组测试数据的第一行是一个整数n(1<n<10000)表示该测试数据共有n个活动.随后的n行,每行有

ACM--移动桌子--贪心--HDOJ 1050--Moving Tables

HDOJ题目地址:传送门 Moving Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 28729    Accepted Submission(s): 9435 Problem Description The famous ACM (Advanced Computer Maker) Company has rented

Num 27 : NYOJ : 0448 寻找最大数 [ 贪心 ]

一道经典的贪心问题:如题: 寻找最大数 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 请在整数 n 中删除m个数字, 使得余下的数字按原次序组成的新数最大, 比如当n=92081346718538,m=10时,则新的最大数是9888 输入 第一行输入一个正整数T,表示有T组测试数据 每组测试数据占一行,每行有两个数n,m(n可能是一个很大的整数,但其位数不超过100位,并且保证数据首位非0,m小于整数n的位数) 输出 每组测试数据的输出占一行,输出剩余的数字按原次

nyoj 364——田忌赛马——————【贪心】

田忌赛马 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 Here is a famous story in Chinese history. "That was about 2300 years ago. General Tian Ji was a high official in the country Qi. He likes to play horse racing with the king and others." "Both of

NYOJ 220 (红黑树--模拟)

链接:click here 题意:题目其实很简单,绕一大圈,原来就是叫你输出输出中序遍历,Orz~~~红黑树经过旋转后中序遍历其实是不变的,所以与下面的旋转没有关系~~--- _ --. 思路:直接数组模拟,或用结构体:包含(数据域,左子树,右子树) 代码: #include <iostream> #include <stdio.h> #include <string.h> #include <vector> #include <algorithm&g

NYOJ 915 +-字符串【贪心】

+-字符串 时间限制:1000 ms  |  内存限制:65535 KB 难度:1 描述 Shiva得到了两个只有加号和减号的字符串,字串长度相同.Shiva一次可以把一个加号和它相邻的减号交换.他想知道最少需要多少次操作才能把第一个字符串变换成第二个字符串.你现在要去帮助他完成那个这个问题. 输入 多组测试数据 每组数据有两行,每行包含一个由"+"和"-"最成的字符串.每个子符串长度不超过5000. 输出 仅一个整数,输出最少需要操作的次数.如果答案不存在,输出-