区间段问题

有n项工作,每项工作分别在Si时间开始,然后在Ti时间结束。对于每项工作,你都可以选择参与或者不参与。如果你选择了参与,那么你必须自始至终都全程参与。此外,参与的时间段不能重叠。(即使是开始的瞬间和结束的瞬间的重叠也是不允许的)

时间不限,你的目的是参与尽可能多的工作,那么最多能参与多少项工作呢?

思路:贪心算法。->在可选的工作中,每次都选取工作结束时间最早的工作。结束时间越早之后可选的工作也就越可能的多。

代码如下:代码中有详解。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=201314;
struct node//工作结构体
{
    int s,t;
} p[maxn];
int cmp(node a,node b)
{
    if(a.t==b.t)
        return a.s<b.s;
    return a.t<b.t;
}
int main()
{
    int n;
    while(cin>>n)
    {
        memset(p,0,sizeof(p));
        for(int i=0; i<n; i++)//输入时间段
            cin>>p[i].s>>p[i].t;
        //对每一项工作结束时间进行从小到大的排序。
        sort(p,p+n,cmp);
        int ans=0,now_begin=0;//初始化工作时间段的开始为0
        for(int i=0; i<n; i++)
        {
            if(now_begin<p[i].s)
            {
                now_begin=p[i].t;
                ans++;//表明这个工作段是可用的,所以选取。
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}
样例如下:
5
1 3
4 7
2 5
8 10
6 9

3
时间: 2024-08-26 11:35:26

区间段问题的相关文章

求区间段数问题-贪心思想

Problem Description(hdu2037,水题) "今年暑假不AC?""是的.""那你干什么呢?""看世界杯呀,笨蛋!""@#$%^&*%..."确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了.作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事).非常6+7.超级女生,以

2016shenyang-1002-HDU5893-List wants to travel-树链剖分+线段树维护不同区间段个数

肯定先无脑树链剖分,然后线段树维护一段区间不同个数,再维护一个左右端点的费用. 线段树更新,pushDown,pushUp的时候要注意考虑链接位置的费用是否相同 还有就是树链剖分操作的时候,维护上一个更新的位置的费用. 总之就是出现区间合并,就考虑总数是否要减一 好想不好写 //场上根本写不完啊 1 /*--------------------------------------------------------------------------------------*/ 2 3 #inc

ZOJ 1610——Count the Colors——————【线段树区间替换、求不同颜色区间段数】

Count the Colors Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%lld & %llu Submit Status Practice ZOJ 1610 Description Painting some colored segments on a line, some previously painted segments may be covered by some the subsequent o

HDU 5381(The sum of gcd-莫队算法解决区间段gcd的和)

The sum of gcd Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 784    Accepted Submission(s): 335 Problem Description You have an array A,the length of A is n Let f(l,r)=∑ri=l∑rj=igcd(ai,ai+1..

mysql 获取指定日期到指定日期 区间段的日期

第一种方法: cross join (就相当于mysql中的循环) CROSS JOIN 把两张表中的数据进行 N * M的组合,即笛卡尔积 这里的两张表利用 union all都有5条数据,所以进行 cross join 后 就有25条数据 而指定的日期区间就会从这25条数据总产生 select CURDATE() - INTERVAL '1' day NOW()(获取当前日期和时间) CURDATE() (获取当前日期) CURTIME() (获取当前时间) 这里用到的是一个 INTERVA

Accessoft-日期区间段查询示例,开始日期至截止日期区段查询

实现功能效果如下: 示例查询开始日期为2017年3月15日到2017年3月16日的内容: sql查询语句如下: SELECT Info.add_time FROM Info where add_time>= #17-03-15# and add_time < #17-03-17# ORDER BY add_time desc

计算一周区间段

private String[] getDateArrByWeek(Date startDate, Date endDate) { Calendar c = Calendar.getInstance();   List<String> list = new ArrayList<String>(); SimpleDateFormat df = new SimpleDateFormat("YYYY年MM月dd日"); for (; startDate.getTime

SQL语句:两个时间区间段,只要有交集,就能筛选出来

设定固定时间段:8.2--->8.5 也就是:两个时间段,只要有交集就能筛选出来: 下面的两个sql语句,实现的效果是一样的: 1:$sql="select * from fs_ads where `start_time` <= '$ed' and `end_time` >= '$sd'"; 2: $sql="select * from (select ads_id,file_id,client_type,client_name,brand,model,ca

oracle截取字符串区间段的一部分字符串

Oracle SQL中实现indexOf和lastIndexOf功能,substr和instr用法 博客分类: oracle PL/SQL instrsubstrlastindexofindexoforacle . Oracle SQL中实现indexOf和lastIndexOf功能 Oracle, SQL, indexOf, lastIndexOf 今天遇到一个问题,需要将一个格式为1_2_3这样的字符串拆解组成1_3的串,并用SQL更新数据库. 在Oracel中,可以用substr和INST