1、出租车问题
一、题目描述:
1、前提环境:有N个固定车站点,这些车站点呈圆形分布。相邻2个站点的行车时间固定为5,每个站点内的出租车数目足够多(即,每个乘客随时随地都能打到车)。
2、行驶规则:每辆出租车在圆形线路上运行,方向可以是顺时针也可以是逆时针,选择最短的路线运行。如果起始和终点相同,则为无效订单,不处理。
二、题目要求:
现有K个乘客,每个乘客包含使用出租车的时间,上车站点,下车站点。计算整个运行中,最多有多少辆出租车同时运行。
三、输入:
第一行输入N和K。N:站点的数量,K:乘客数量。2<=N<=100,0<=K<=10000。
之后K行,每行输入使用车辆的初始时间,上车站点ID,下车站点ID,0<=起始时间<=1000
四、输出:
最大同时运行的出租车数量
例1:
输入:
50 3
0 0 15
10 10 11
15 20 40
输出:2
解释:
第一个乘客使用第一辆出租车
第二个乘客上车时,第一辆出租车只行驶了2站,因此现在同时运行2辆出租车
第三个乘客上车时,第一辆出租车行驶了3站,第二辆出租车行驶了一站,到达目的地,因此此时同时运行的出租车还是2辆。
例2:
输入:
10 3
0 0 1
5 0 9
10 0 1
输出:1
解释:
第一个乘客时间点0上车,耗时5,在时间点5下车
第二个乘客时间点5上车,耗时5,此时乘客1处于下车状态,不计算在内,因此还是1辆出租车
第三个乘客时间点10上车,耗时5,此时乘客2处于下车状态,不计算在内,因此还是1辆出租车
通过100%代码:
#include <vector>
#include <iostream>
using namespace std;
int main(){
int N, K;
cin >> N >> K;
vector<vector<int>> nums(K, vector<int>(2));
for(int i = 0; i < K; i++){
int start, end;
cin >> nums[i][0]
>> start
>> end;
nums[i][1] = 5 * min(abs(end - start), N - abs(end - start));//每个乘客的耗时时间
}
int ret = 0;
vector<int> timeline(10000, 0);
for(int i = 0; i < K; i++){ // 对于每个乘客
for(int j = nums[i][0]; j < nums[i][0] + nums[i][1]; j++){//[使用车辆开始时间,使用车辆开始时间+耗时时间)
++timeline[j];
if(timeline[j] > ret) ret = timeline[j];
}
}
cout << ret << endl;
return 0
}
2、任务调度问题
一、题目描述:
生产车间有贵重仪器N台,并且有一定数量的需要使用仪器的生产测试设备数量K台,而且设定了每台生产测试设备要占用仪器的时间和优先级为[T,P]。通过合理调度分配后,要求所有生产测试设备要占用贵重仪器的测试项目都执行完成,所需要的最少时间。
仪器数量N: 1 <=N=< 1000;
生产设备数量K: 1 <=K<1000;
二、说明:
优先级越高的生产测试设备优先使用仪器,P的数字越小优先级越高;
当优先级相同的情况下,占用时间长的优先执行。
三、输入:
第一行输入为N和K。N:生产车间的贵重仪器数量,K:需要使用仪器的生产测试设备数量;
之后有K行,每行表示一台生产测试设备要占用仪器的时间和优先级为[T,P] :
1<= N=< 1000,1 <=K< 1000,1<= T=<1000,1<= P< 1000
四、输出:
所有生产测试设备要占用贵重仪器的测试项目都执行完成,所需要的最少时间。
例1:
输入:
2 2
3 1
4 2
输出:
4
解释:
可分配使用的仪器有2台;占用时间越长,优先级越亮的生产测试设备优先使用仪器;
[4,2]分配使用仪器1,[3,1]分配使用仪器2; 生产测试设备数量与仪器数量相等,所以需要花费的时间就是取占用仪器最长的时间,结果是4。
例2:
输入:
3 7
1 1
4 1
5 3
4 2
2 1
3 3
2 1
输出:
8
解释:
可分配使用的仪器有3台;占用时间越长,优先级越高的生产 测试设备优先使用仪器;
(1)[4,1]分配便用仪器1,[2,1]分配使用仪器2,[2,1]分配使用仪器3;
(2)[1,1]分配使用仪器2,[4,2]分配使用仪器3,[5,3]分配使用仪器2;
(3)[3,3]分配使用仪器1;
所有生产测试设备都执行完后,需要花费的时间就是取占用仪器最长的时间,结果是8。
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
// struct line{
// int T;
// int P;
// };
static bool cmp(const pair<int,int>& a, const pair<int,int>& b){
if(a.second < b.second) return true;
if(a.second == b.second && a.first > b.first) return true;
return false;
}
//void print(const vector<pair<int,int>>& lines){
// for(auto l:lines){
// cout << l.first << ", " << l.second << endl;
// }
//}
int main(){
int n, k; // 仪器数,设备数
cin >> n >> k;
vector<pair<int,int>> lines(k);
for(int i = 0; i < k; i++){
cin >> lines[i].first >> lines[i].second;
}
int res=0;
// 1、如果仪器数 大于等于 设备数,取设备中占用仪器最长的时间
if(n>=k){
res=lines[0].first;
for(int i = 0; i < k; i++)
{
if(res<lines[i].first)
res = lines[i].first;
}
cout<<res<<endl;
return res;
}
// 2、如果仪器数 小于 设备数
// (1)排序。得到每个设备使用仪器的顺序,即进入队列的先后顺序
// print(lines);
sort(lines.begin(), lines.end(), cmp);
// cout << "after sort:" << endl;
// print(lines);
//(2)当超过仪器数时
priority_queue<int, vector<int>, greater<int> > que; // 小顶堆
for (int i=0;i<n;i++) {
que.push(lines[i].first);
}
for(int i=n;i<k;i++){
int tmp=que.top();
que.pop();
tmp+=lines[i].first;
que.push(tmp);
}
const int sum=que.size();
for(int i=0;i<sum;i++){
res=que.top();
que.pop();
}
cout << res<<endl;
return 0;
}
3、开销问题
一、题目描述:
为了提高网络的可靠性,网络中经常建设些低速链路, 对工作路径实现保护, 但这些低速链路需要设置一个合理的开销值,以免正常条件下流量走到低速链路上,影响体验,现在你的工作是评估网络中路径的最大开销,以确定新增路径的开销设置,只有当新增路径的开销大于当前最长路径的开销才能保证正常情况下网络流量不会走到低速链路上。网络中链路均为有向链路,且不存在环路。
二、输入:
链路集合,每条链路由源节点,目的节点和边的权重表示,链路存在方向。
如:[[1,2,5],[1,3,5],[4,2,10],[2,5,5],[3,4,10],[3,7,10],[4,7,5],[5,6,5],[6,7,5]]
三、输出:
最长路径的开销值
如:40
例:
输入:
[[1,2,5],[1,3,5],[4,2,10],[2,5,5],[3,4,10],[3,7,10],[4,7,5],[5,6,5],[6,7,5]]
输出:
40
归纳:有向图中,求源节点到目的节点的最长路径的权重之和(即,求最大权重和)?