zoukankan      html  css  js  c++  java
  • 1.9 效率高,安排约会

    称号:

    天。至N一个采访,他们的时间为[B[i], E[i]]。分别比结束采访时面试的开始时间。此N在多个采访点的面试安排。不同的采访在同一时间,不能安排在同一个采访点。

    现在,它需要如何,至少许多采访得点。


    分析思路:

    通过贪心算法来解决。算法的思路是:对于全部的面试I[i] = [B[i], E[i]]。按B[i]从小到大排序,然后按顺序对各个区间着色。

    对当前区间i着色时,必须保证所着的颜色(color[i])没有被出如今这个区域之前且时间段与当前区间有重叠的区间用到。

    如果面试的总数为N。那么代码例如以下:

    int nMaxColor = 0, k = 0;
    bool isForbidden[NMAX];
    for(int i = 0; i < n; ++i) {
    	for(k = 0; k < nMaxColor; ++k) isForbidden[k] = false;
    	for(int j  = 0; j < i; ++j) if(Overlap(b[j], e[j], b[i], e[i])) isForbidden[color[j]] = true;
    	for(k = 0; k < nMaxColor; ++k) if(!isForbidden[k]) break;
    	if(k < nMaxColor) color[i] = k;
    	else color[i] = nMaxColor++;
    }

    上述代码中nMaxColor就是最后返回的所需的最少颜色。

    isForbidden是对于每一个时间区间i,其它时间区间j中開始时间位于这个时间区间之前的且与这个时间区间有重叠的面试所占用的颜色的标识数组。

    Overlap函数,则是用来推断两个时间区间是否有重叠。



    另一种更简单的思路:

    我们要得到的是最少所需的颜色数

    仍然先对面试数组排序, 然后遍历面试数组, 每遇到一个 B, color +1, 并维护全局最大 color 数。 每遇到一个 E, color 数减一. 返回全局最大 color 值

    代码例如以下:

    int nColorUsing = 0, nMaxColor = 0;
    for(int i = 0; i < 2 * n; ++i) {
    	if(TimePoints[i].type == "Begin") {
    		nColorUsing++;
    		if(nColorUsing > nMaxColor) nMaxColor = nColorUsing;
    	}else nColorUsing--;
    }








    版权声明:本文博客原创文章。博客,未经同意,不得转载。

  • 相关阅读:
    C# 面向对象之概念理解(2)
    Linux中常用常用常用快捷键
    shell基本脚本命令
    awk命令详解及应用技巧
    Windows(64位IIS)未在本地计算机上注册“Microsoft.Jet.OLEDB.4.0”提供程序
    基础知识(net)<3> virtural , new ,override
    WCF REST<2>: 消费WCF REST 服务
    智能表单(2):简单使用HtmlEditor
    智能表单(1) : 开源HtmlEditor介绍
    ASP.NET Web API <2> 跨域消费Web API(JSONP)
  • 原文地址:https://www.cnblogs.com/zfyouxi/p/4754422.html
Copyright © 2011-2022 走看看