input.txt
5
1 23
12 28
25 35
27 80
36 50
ouput.txt
3
问题描述:
假设有足够多的场地中,有一批任务要使用场地,求最少使用场地的数目。
#include <iostream>
#include<stdlib.h>
#include <fstream>
#include <string>
using namespace std;
int main(){
//数据读取
ifstream in("input.txt", ios::in);
if (!in.is_open()){
cout << "Error opening file";
exit(1);
}
char ch;
int n = in.get() - '0';
while ((ch = in.get()) != '\n'){
n = n * 10 + ch - '0';
}
int** m = new int*[n]; {
for (int i = 0; i < n; i++){
m[i] = new int[3];
}
}
int i = 0;
while (!in.eof()){
m[i][0] = in.get() - '0';
while ((ch = in.get()) != ' '){
m[i][0] = m[i][0] * 10 + ch - '0';
}
m[i][1] = in.get() - '0';
while ((ch = in.get()) != '\n'){
if (in.eof())break;
m[i][1] = m[i][1] * 10 + ch - '0';
}
i++;
}
for (int i = 0; i < n; i++){
cout << m[i][0] << " " << m[i][1] << endl;
}
in.close();
//数据处理
//排序早结束的任务
for (int i = 0; i < n-1; i++){
for (int j = i + 1; j < n; j++){
if (m[i][1]>m[j][1]){//发现比i要小的任务提早结束进行替换
int tend = m[i][0];
m[i][0] = m[j][0];
m[j][0] = tend;
tend = m[i][1];
m[i][1] = m[j][1];
m[j][1] = tend;
}
}
}
for (int i = 0; i < n; i++){
cout << m[i][0] << " " << m[i][1] << endl;
}
//核心算法
int venue = 0;//记录最少会场数
int over = 0;//记录已排的场数
while (over<n){
int i = 0;
while (m[i][1]==0){
i++;
}
int endtime = m[i][1];
m[i][1] = 0;
over++;
for (i++; i < n; i++){
if ((m[i][1]!=0)&&(m[i][0] > endtime)){//如果下一个的开始时间大于上一个任务的开始时间就允许执行
over++;
endtime = m[i][1];
m[i][1] = 0;
}
}
venue++;
}
cout <<"最少会场数"<< venue << endl;
}