The famous ACM (Advanced Computer Maker) Company has rented a floor of a building whose shape is in the following figure.
Table moving | Reason | |
Possible | ( room 30 to room 50) and (room 60 to room 90) | no part of corridor is shared |
(room 11 to room 12) and (room 14 to room 13) | no part of corridor is shared | |
Impossible | (room 20 to room 40) and (room 31 to room 80) | corridor in front of room 31 to room 40 is shared |
(room 1 to room 4) and (room 3 to room 6) | corridor in front of room 3 is shared | |
(room 2 to room 8) and (room 7 to room 10) | corridor in front of room 7 is shared |
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.
Input
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 N +3-rd line, the remaining test cases are listed in the same manner as above.Output
The output should contain the minimum time in minutes to complete the moving, one per line.Sample Input
3 4 10 20 30 40 50 60 70 80 2 1 3 2 200 3 10 100 20 80 30 50
Sample Output
10 20 30题意:要搬东西。每个东西要搬10分钟,几个东西可以同时搬,但是走廊很窄,相同的走廊只能搬一个东西。要求出最快要多久可以搬完。
思路:问题可以转换为,找出要占用同一个走廊的最大值即可,一开始看刘汝佳的最大不相交区间,以为是那样写,写得挺麻烦的结果还是过了。不过有一个不明白的地方,就是改了个排序方式才过的。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int t, n, vis[405], Max;
struct R {
int start;
int end;
} r[205];
int main() {
scanf("%d", &t);
while (t --) {
Max = 0;
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
scanf("%d%d", &r[i].start, &r[i].end);
if (r[i].start > r[i].end)
swap(r[i].start, r[i].end);
for (int j = r[i].start; j <= r[i].end; j ++) {
vis[j] ++;
if (Max < vis[j])
Max = vis[j];
}
if (r[i].start % 2 == 0)//注意由于走廊是对称的,要考虑这种特殊情况
vis[r[i].start - 1] ++;
if (Max < vis[r[i].start - 1])
Max = vis[r[i].start - 1];
if (r[i].end % 2)
vis[r[i].end + 1] ++;
if (Max < vis[r[i].end + 1])
Max = vis[r[i].end + 1];
}
printf("%d\n", Max * 10);
}
return 0;
}
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int t, n, num, qnum, en;
struct Interval {
int start, end, v;
} q[205];
int cmp (Interval a, Interval b) {
return a.start < b.start;//这里改一下就过了。。
}
int main() {
scanf("%d", &t);
while (t --) {
num = 0; qnum = 0;
memset(q, 0, sizeof(q));
scanf("%d", &n);
for (int i = 0; i < n; i ++) {
scanf("%d%d", &q[i].start, &q[i].end);
if (q[i].start > q[i].end)
swap(q[i].start, q[i].end);
}
sort (q, q + n, cmp);
while (qnum < n) {
for (int i = 0; i < n; i ++) {
if (!q[i].v) {
q[i].v = 1;
qnum ++;
en = q[i].end;
if (en % 2)//由于是对称的,所以要这样讨论。
en ++;
for (int j = 0; j < n; j ++) {
if (q[j].start > en && !q[j].v) {
en = q[j].end;
q[j].v = 1;
qnum ++;
}
}
break;
}
}
num ++;
}
printf("%d\n", num * 10);
}
return 0;
}