zoukankan      html  css  js  c++  java
  • 区间调度问题

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

      目标是尽可能参与可能多的工作,那么最多能参与多少项工作?

    /*
    	1:每次选取结束时间最早的任务
    	2:选取T数字最小的时间段
    */
    #include "iostream"
    #include "algorithm"
    
    using namespace std;
    
    const int MAX_N = 100000;
    int N = 5, S[MAX_N] = { 1,2,4,6,8 }, T[MAX_N] = {3,5,7,9,10};
    pair<int, int> itv[MAX_N];
    
    void solve() {
    	for (int i = 0; i < N; i++) {
    		itv[i].first = T[i];
    		itv[i].second = S[i];
    	}
    	/*
    		sort:首先根据first进行排序,first数据相同根据second排序
    			 按照由小及大进行排序,即按照结束时间最小进行排序,结束时间相同按照开始时间最小进行排序。
    	*/
    	sort(itv, itv + N);
    	int ans = 0, t = 0;
    	/*
    		结束时间小于下一个最先结束可执行时间,
    	*/
    	for (int i = 0; i < N; i++) {
    		if (t < itv[i].second) {
    			ans++;
    			t = itv[i].first;
    		}
    	}
    	cout << ans << endl;
    }
    int main() {                                                             
    	solve();
    	system("pause");
    }
    
  • 相关阅读:
    mysql查看每张表的空间使用情况
    下一步开发的技术点
    技术体系需要继续探索的东西
    架构体系需要进一步研究探索的V2路线图
    串行写队列的MYSQL大文本参数
    Node.js 数据存储方式的选择
    Node.js npm 详解
    Node入门
    Node.js知识点学习
    为什么应使用 Node.js
  • 原文地址:https://www.cnblogs.com/sky-z/p/5595903.html
Copyright © 2011-2022 走看看