贪心算法——招聘会

来源:互联网 发布:词典推荐 知乎 魏 编辑:程序博客网 时间:2024/05/14 09:32
题目描述:

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

输入:

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

输出:

最多参加的招聘会个数。

样例输入:
39 1010 208 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中。

原创粉丝点击