贪心算法——招聘会
2017-08-15 17:43
260 查看
题目描述:
又到毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。
输入:
第一行n,有n个招聘会,接下来n行每行两个整数表示起止时间,由从招聘会第一天0点开始的小时数表示。
n <= 1000 。
输出:
最多参加的招聘会个数。
样例输入:
样例输出:
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中。
又到毕业季,很多大公司来学校招聘,招聘会分散在不同时间段,小明想知道自己最多能完整的参加多少个招聘会(参加一个招聘会的时候不能中断或离开)。
输入:
第一行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中。
相关文章推荐
- 九度题目1463:招聘会 算法之美(面试算法每日一题系列) 贪心算法
- 参加最多招聘会问题|贪心算法
- 九度 1463 招聘会(任务调度, 贪心算法)
- 九度OJ 1463 贪心算法、优先队列、运算符重载之《招聘会》
- 贪心算法
- 参加招聘会
- 贪心算法的运用 ——集装箱的装箱问题
- 活动选择问题(算法导论第十六章贪心算法)
- 单源最短路径(贪心算法)
- 算法设计与分析复习――第四章:贪心算法
- ACM水题-合并果子(堆结构,贪心算法,AC)
- acm hdu1052 田忌赛马【贪心算法】
- 贪心算法和动态规划
- 贪心算法
- 〖編程·C++〗贪心算法 - 排队最短等待时间
- 算法设计方法-贪心算法
- Moving Tables hdu1050 贪心算法
- 贪心算法
- HDU 2037 今年暑假不AC (贪心算法)
- NYOJ14——会场安排(贪心算法)