首页 > ACM题库 > HDU-杭电 > hdu 2341 Tower Parking-模拟[解题报告]C++
2014
01-05

hdu 2341 Tower Parking-模拟[解题报告]C++

Tower Parking

问题描述 :

There is a new revolution in the parking lot business: the parking tower. The concept is simple: you drive your car into the elevator at the entrance of the tower, and the elevator and conveyor belts drag the car to an empty parking spot, where the car remains until you pick it up. When you return, the elevator and conveyor belts move your car back to the entrance and you’re done.

The layout of the tower is simple. There is one central elevator that transports the cars between the different floors. On each floor there is one giant circular conveyor belt on which the cars stand. This belt can move in clockwise and counterclockwise direction. When the elevator arrives on a floor, it becomes part of the belt so that cars can move through it.

At the end of the day the tower is usually packed with cars and a lot of people come to pick them up. Customers are processed in a first come first serve order: the elevator is moved to the floor of the first car, the conveyor belt moves the car on the elevator, the elevator is moved down again, and so on. We like to know how long it takes before the last customer gets his car. Moving the elevator one floor up- or downwards takes 10 seconds and moving a conveyor belt one car in either direction takes 5 seconds.

输入:

On the first line one positive number: the number of testcases, at most 100. After that per testcase:

One line with two integers h and l with 1 ≤ h ≤ 50 and 2 ≤ l ≤ 50: the height of the parking tower and the length of the conveyor belts.

h lines with l integers: the initial placement of the cars. The jth number on the ith line describes the jth position on the ith floor. This number is -1 if the position is empty, and r if the position is occupied by the rth car to pick up. The positive numbers form a consecutive sequence from 1 to the number of cars. The entrance is on the first floor and the elevator (which is initially empty) is in the first position. There is at least one car in the parking tower.

输出:

On the first line one positive number: the number of testcases, at most 100. After that per testcase:

One line with two integers h and l with 1 ≤ h ≤ 50 and 2 ≤ l ≤ 50: the height of the parking tower and the length of the conveyor belts.

h lines with l integers: the initial placement of the cars. The jth number on the ith line describes the jth position on the ith floor. This number is -1 if the position is empty, and r if the position is occupied by the rth car to pick up. The positive numbers form a consecutive sequence from 1 to the number of cars. The entrance is on the first floor and the elevator (which is initially empty) is in the first position. There is at least one car in the parking tower.

样例输入:

2
1 5
-1 2 1 -1 3
3 6
-1 5 6 -1 -1 3
-1 -1 7 -1 2 9
-1 10 4 1 8 -1

样例输出:

25
320


题意:比较难懂…可以这样理解:有电梯和传送带从车场向外运车,每次传送带送到电梯口,传送带为环形(注意:可以顺时针和逆时针转)。

注意一下几点:车按照1 2 3 ….n的顺序运出;不同层之间没有任何影响;电梯和传送带之间不是同时工作;电梯口的位置是上一次车走的位置;

代码如下:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std; 
struct park
{
    int x, y;
}; 
int main()
{
    int i, j, n, m, T, k, t;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d%d", &n, &m);
        park p[2505]; 
        int turn[55];
        memset(turn, 0, sizeof(turn)); 
        int num=0; 
        for(i=1; i<=n; i++)
        { 
            turn[i]=1; 
            for(j=1; j<=m; j++)
            {
                scanf("%d", &k);
                if(k==-1) 
                    continue;
                num++;
                p[k].x=i, p[k].y=j;
            }
        } 
        int total=0; 
        int mid; 
        for(i=1; i<=num; i++)
        {
            if(p[i].y>turn[p[i].x])
                 mid=p[i].y-turn[p[i].x];
            else
                mid=turn[p[i].x]-p[i].y; 
            total+=20*(p[i].x-1)+5*(min(mid, m-mid));
            turn[p[i].x]=p[i].y;
        }
        printf("%d\n", total);
    }
}    

 


  1. for(int i=1; i<=m; i++){
    for(int j=1; j<=n; j++){
    dp = dp [j-1] + 1;
    if(s1.charAt(i-1) == s3.charAt(i+j-1))
    dp = dp[i-1] + 1;
    if(s2.charAt(j-1) == s3.charAt(i+j-1))
    dp = Math.max(dp [j - 1] + 1, dp );
    }
    }
    这里的代码似乎有点问题? dp(i)(j) = dp(i)(j-1) + 1;这个例子System.out.println(ils.isInterleave("aa","dbbca", "aadbbcb"));返回的应该是false

  2. 问题3是不是应该为1/4 .因为截取的三段,无论是否能组成三角形, x, y-x ,1-y,都应大于0,所以 x<y,基础应该是一个大三角形。小三角是大三角的 1/4.

  3. 题本身没错,但是HDOJ放题目的时候,前面有个题目解释了什么是XXX定律。
    这里直接放了这个题目,肯定没几个人明白是干啥

  4. 博主您好,这是一个内容十分优秀的博客,而且界面也非常漂亮。但是为什么博客的响应速度这么慢,虽然博客的主机在国外,但是我开启VPN还是经常响应很久,再者打开某些页面经常会出现数据库连接出错的提示

  5. 有两个重复的话结果是正确的,但解法不够严谨,后面重复的覆盖掉前面的,由于题目数据限制也比较严,所以能提交通过。已更新算法