区间段问题

本文介绍了一种基于贪心算法的任务调度方法,旨在通过选择结束时间最早的任务来最大化可完成的任务数量。通过实例演示了算法的具体实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有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


 

 

 

### 处理连续区间和数据分组的方法 在 Excel 中处理连续区间以及进行数据分组是一项常见的需求,尤其是在分析大量数据时。以下是几种方法来解决这一问题。 #### 使用 FREQUENCY 函数 `FREQUENCY` 是一种非常有效的函数,用于计算数值落在指定区间内的频率[^2]。通过定义不同的区间边界,可以轻松统计某一范围内数据的数量。例如,如果要统计学生成绩中及格(大于等于 60 分)的人数,可以通过设置 `bins_array` 参数为 `[59, MAX_VALUE]` 来划分 `(0,59]` 和 `(60, ∞)` 的两个区间,并进一步利用其他函数完成更复杂的运算。 #### 利用 Power Query 实现自定义分组逻辑 Power Query 提供了一种灵活的方式来创建基于特定规则的新字[^3]。假设有一份学生考试成绩列表,希望按分数将其分为 “不及格”、“及格” 或更高类别,则可以在加载到查询编辑器后新增一个名为“分组”的列。此操作可通过编写简单的 M 脚本来实现自动化流程: ```M let Source = Table.FromRows(Json.Document(Binary.Decompress(File.Contents("C:\path\to\data.csv"), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [StudentID=_t, Score=Int64.Type]), #"Added Custom" = Table.AddColumn(Source, "Group", each if [Score] >= 0 and [Score] <= 59 then "Fail" else if [Score] > 59 and [Score] <= 75 then "Pass" else if [Score] > 75 and [Score] <= 89 then "Good" else if [Score] > 89 and [Score] <= 100 then "Excellent" else null) in #"Added Custom" ``` 上述脚本展示了如何根据不同条件给每条记录分配相应的标签。 #### 编程方式生成区间表达式 当面对的是纯文本形式的一系列离散整数而非实际测量所得的数据集时,可能需要先整理这些数字成为紧凑的形式以便阅读理解。此时可借助某些高级工具或者编程语言如 Python 完成转换任务[^5]。下面给出一伪代码样例说明思路: ```python def compress_sequence(nums): nums.sort() result = [] start = end = None for num in nums: if not start or num != end + 1: if start is not None: result.append(f"{start}" if start == end else f"{start}-{end}") start = end = num else: end += 1 if start is not None: result.append(f"{start}" if start == end else f"{start}-{end}") return ','.join(result) print(compress_sequence([1,2,3,5,7,8,10])) # Output: '1-3,5,7-8,10' ``` 该算法接受任意无序正整数组合作为其输入参数并返回压缩后的字符串表示法。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值