舒适圈这么舒服,在里面不好吗(手动狗头.jpg
题在小白书40页
题目描述
有n项工作,每项工作分别在si时间开始,在ti时间结束。对于每项工作,你都可以选择参与与否,。如果选择了参与,那么自始至终都必须全程参与。此外,参与工作的时间段不能重叠(即使是开始的瞬间和结束的瞬间重叠也是不允许的)。
你的目标是参与尽可能多的工作,那么最多能参与多少项工作呢?
限制条件
1≤n≤100000
1≤si≤ti≤109
样例输入
n=5,s={1,2,4,6,8},t={3,5,7,9,10}
输出
3
解法
感觉是讲背包之前的预热8
正解是在可选的工作中,每次都选取结束时间最早的工作。
从结束时间最早的工作开始,记录该时间点,找到最近的一个起始点(此前需要对结束时间排序,保证找到一个起始点之后找到下一个最早结束的时间点,遍历即可得到最多的工作安排)
ps小白书上使用的pair来存,排序直接是sort(a,b),好迷啊,我去搜索一下,回来再改
可能是正确的代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
struct qujian
{
int s,t;
}s[100001];
bool rule(qujian a,qujian b) //排序规则
{
return a.t<b.t;
}
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d %d",&s[i].s,&s[i].t);
}
sort(s+1,s+1+n,rule); //根据结束时间排序
int sum=0,min=0;
for(int i=1;i<=n;++i)
{
if(min<s[i].s) //判断开始时间是否大于结束时间
{
++sum;
min=s[i].t; //更改结束时间点
}
}
printf("%d\n",sum);
return 0;
}