题目大意
在要在个个房间之间搬桌子,但是只有一条很窄的走廊,每次只能过一个桌子,而且每搬一个桌子要10分钟,所以如果我们要搬的任意两个桌子之间的起点与终点有重合的地方,就要再等10分钟。然后输入要搬几个桌子以及要搬的每个桌子是从哪个房间到哪个房间,问我们最短需要花多少时间。
- 输入的两个数是有可能第一个大于第二个的。
- 注意1,2在走廊中共享的一个位置。
思路分析
最近数据结构学的有点多,思维有点僵化,简单题也想不出来,难受啊。
经过思考看完大佬的提示 其实就是把200个走廊单独维护一个数组,每次输入一对
,就把他们运送过程占用的走廊全部+1,最后使用次数最多的走廊*10就是必须的时间。不过在此基础上我又想到了另一种解法
走廊分别计数解法
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
#define MAX 205
#define P pair<int,int>
int cnt[MAX];
int main() {
int T, N, a, b, res = 0;
scanf("%d", &T);
while (T--) {
memset(cnt, 0, sizeof(cnt));
scanf("%d", &N); res = 0;
for (int i = 0; i < N; i++) {
cin >> a >> b; if (a > b)swap(a, b);
if (a % 2 == 0)a = a / 2;
else a = a / 2 + 1;
if (b % 2 == 0)b = b / 2;
else b = b / 2 + 1;
for (int i = a; i <= b; i++) {
cnt[i]++;
}
}
for (int i = 1; i <= 200; i++)res = max(res, cnt[i]);
printf("%d\n", res * 10);
}
}
简单机器调度解法
其实只要确定了每个货物运输所占用的区间,然后就是一个基本的机器调度问题,我们把区间从小到大排序,然后遍历每一个区间。如果他可以和之前的某个区间的最后一个元素同时执行,那么就把它加到这个区间里,如果不能和之前所有的区间共存,就新开一个。最后开出来的种类数*10就是答案。
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
using namespace std;
#define MAX 205
#define P pair<int,int>
int cnt[MAX];
vector<P> v[MAX], t;
int main() {
int T, N, a, b, res = 0, sign = 1, k = 0;
scanf("%d", &T);
while (T--) {
scanf("%d", &N); res = 0; t.clear(); k = 0;
for (int i = 0; i < MAX; i++)v[i].clear();
for (int i = 0; i < N; i++) {
cin >> a >> b; if (a > b)swap(a, b);
if (a % 2 == 0)a = a / 2;
else a = a / 2 + 1;
if (b % 2 == 0)b = b / 2;
else b = b / 2 + 1;
t.push_back(P(a, b));
}
sort(t.begin(), t.end());
for (int i = 0; i < N; i++) {
sign = 1;
for (int j = 0; j < k && sign; j++)//可以和该区间同时进行
if (t[i].first > v[j][v[j].size() - 1].second)v[j].push_back(t[i]), sign = 0;
if (sign)v[k++].push_back(t[i]);
}
printf("%d\n", k * 10);
}
}