zoukankan      html  css  js  c++  java
  • N Emergency Evacuation题解

    题目

    The Japanese government plans to increase the number of inbound tourists to forty million in the year 2020, and sixty million in 2030. Not only increasing touristic appeal but also developing tourism infrastructure further is indispensable to accomplish such numbers.

    One possible enhancement on transport is providing cars extremely long and/or wide, carrying many passengers at a time. Too large a car, however, may require too long to evacuate all passengers in an emergency. You are requested to help estimating the time required.

    The car is assumed to have the following seat arrangement.

    • A center aisle goes straight through the car, directly connecting to the emergency exit door at the rear center of the car.

    • The rows of the same number of passenger seats are on both sides of the aisle.

    A rough estimation requested is based on a simple step-wise model. All passengers are initially on a distinct seat, and they can make one of the following moves in each step.

    • Passengers on a seat can move to an adjacent seat toward the aisle. Passengers on a seat adjacent to the aisle can move sideways directly to the aisle.

    • Passengers on the aisle can move backward by one row of seats. If the passenger is in front of the emergency exit, that is, by the rear-most seat rows, he/she can get off the car.

    The seat or the aisle position to move to must be empty; either no other passenger is there before the step, or the passenger there empties the seat by moving to another position in the same step. When two or more passengers satisfy the condition for the same position, only one of them can move, keeping the others wait in their original positions.

    The leftmost figure of Figure (C.1) depicts the seat arrangement of a small car given in Sample Input 1. The car have five rows of seats, two seats each on both sides of the aisle, totaling twenty. The initial positions of seven passengers on board are also shown.

    The two other figures of Figure (C.1) show possible positions of passengers after the first and the second steps. assenger movements are indicated by fat arrows. Note that, two of the passengers in the front seat had to wait for a vacancy in the first step, and one in the second row had to wait in the next step.

    Your task is to write a program that gives the smallest possible number of steps for all the passengers to get off the car, given the seat arrangement and passengers’ initial positions.

    Input

    The input consists of a single test case of the following format.
    (r) (s) (p)
    (i_1) (j_1)
    (.)
    (.)
    (.)
    (i_p) (j_p)
    Here, (r) is the number of passenger seat rows, (s) is the number of seats on each side of the aisle, and (p) is the number of passengers. They are integers satisfying (1 ≤ r ≤ 500, 1 ≤ s ≤ 500), and (1 ≤ p ≤ 2rs.)

    The following (p) lines give initial seat positions of the passengers. The (k)-th line with (i_k) and (j_k) means that the (k)-th passenger’s seat is in the (i_k)-th seat row and it is the (j_k)-th seat on that row. Here, rows and seats are counted from front to rear and left to right, both starting from one. They satisfy (1 ≤ i_k ≤ r and 1 ≤ j_k ≤ 2s.) Passengers are on distinct seats, that is, (i_k != i_l) or (j_k != j_l) holds if (k != l.)

    Output

    The output should be one line containing a single integer, the minimum number of steps required for all the passengers to get off the car.

    Sample

    Sample Input 1

    5 2 7
    1 1
    1 2
    1 3
    2 3
    2 4
    4 4
    5 2
    

    Sample Output 1

    9
    

    Sample Input 2

    500 500 16
    1 1
    1 2
    1 999
    1 1000
    2 1
    2 2
    2 999
    2 1000
    3 1
    3 2
    3 999
    3 1000
    499 500
    499 501
    499 999
    499 1000
    

    Sample Output 2

    1008
    

    题解

    题目大意

    给出每位乘客的座位,问每个乘客都出来最少移动次数。

    每次只能移动一个格,一个格里最多有一个人(将座位和过道看做格子)。

    解题思路

    都出来不好想,可以转换为一个个走到座位的最优方案。

    求出每个人走到自己座位的距离,最长的先走。

    详细内容看注释

    代码

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int N = 5e5+5;
    int r, s, n, d[N], ans;
    bool judge(int x, int y) {
    	return x > y;
    }
    int main() {
    	scanf("%d%d%d", &r, &s, &n);
    	for(int i = 0, x, y; i < n; i++)
    		scanf("%d%d", &x, &y),
    		d[i] = r - x + 1 + (y > s ? y - s : s - y + 1);//三目运算符
    	sort(d, d+n, judge);//从大到小排序
    	for(int i = 0; i < n; i++)//第i个人在第i秒出发前面有i-1秒
    		ans = max(ans, i + d[i]);//所以i从0开始
    	printf("%d", ans);
    	return 0;
    }
    
  • 相关阅读:
    二维数组 A[m][n] 按行优先和按列优先的 下标地址转换公式
    服务器的公网ip 和内网ip
    剑指offer 23.二叉搜索树的后序遍历序列
    剑指offer 22. 从上往下打印二叉树 & 102. 二叉树的层序遍历
    剑指offer 21.栈的压入、弹出序列 & leetcode 剑指 Offer 31. 栈的压入、弹出序列
    剑指offer 4. 重建二叉树 & leetcode 剑指 Offer 07. 重建二叉树 & leetcode hot 100 105. 从前序与中序遍历序列构造二叉树
    Linux配置Nginx+Tomcat负载均衡
    yum安装apache及问题解决
    Linux高级文本处理命令
    JMeter:生成漂亮的多维度的HTML报告
  • 原文地址:https://www.cnblogs.com/Z8875/p/12675580.html
Copyright © 2011-2022 走看看