您的位置:首页 > 其它

贪心算法——招聘会

2017-08-15 17:43 260 查看
题目描述:

又到毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。
输入:

第一行n,有n个招聘会,接下来n行每行两个整数表示起止时间,由从招聘会第一天0点开始的小时数表示。

n <= 1000 。
输出:

最多参加的招聘会个数。
样例输入:
3
9 10
10 20
8 15

样例输出:
2

做题思路如下:
1、对招聘会开始结束的时间进行排序,排序的标准是按照招聘会结束时间来排序,最早结束的放在最前面;
2、排序之后,将最早结束的招聘会放在最前,之后的招聘会只要开始时间大于等于第一个,便可以参加,计数加一。
具体实现C++代码如下所示:
#include<iostream>

#include<vector>

#include<map>

#include<iterator>

#include<algorithm>

using namespace std;

map<int ,int> vectorsort(vector<int> &inputv,vector<int> &startv, vector<int> &endv)

{
int l = inputv.size();
if (l % 2 != 0)
{
cout << "input error!" << endl;
}
int i;
for (i = 0; i < l; i++)
{
if (i % 2 == 0)
{
startv.push_back(inputv[i]);
}
else
{
endv.push_back(inputv[i]);
}
}
map <int, int> m;
//map <int, int>::iterator it;
for (i = 0; i < startv.size(); i++)
{
m.insert(pair<int, int>(endv[i],startv[i] ));//用结束时间——开始时间做键值对
}
return m;

}

int greedyselect(map<int, int>& m)

{
int l = m.size();
int i;
int count = 1;
map <int, int>::iterator it;
it = m.begin();
int firsttime = it->first;
while (++it != m.end())
{

if (it->second >=firsttime)
{
count++;
firsttime = it->first;
}
}
return count;

}

int main()

{
vector<int> input;
int n;
while (cin >> n)
{
input.push_back(n);
}
map<int, int> m1;
vector<int> starttime;
vector<int> endtime;
m1 = vectorsort(input, starttime, endtime);
int num=greedyselect(m1);
cout << num << endl;
system("pause");
return 0;

}

代码的输入为招聘会的开始和结束时间,输出为可以参加的招聘会的个数,为了方便使用,将输入的招聘会的结束——开始时间存入一个Map中。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: