高效率地安排会面 - 编程之美1.9


http://www.cnblogs.com/baiyanhuang/archive/2011/03/19/1988782.html
在校园招聘的季节里,为了能让学生们更好地了解微软亚洲研究院各研究组的情况,HR部门计划为每一个研究组举办一次见面会,让各个研究组的员工能跟学生相互了解和交流(如图1-4所示)。已知有n位学生,他们分别对m个研究组中的若干个感兴趣。为了满足所有学生的要求,HR希望每个学生都能参加自己感兴趣的所有见面会。如果每个见面会的时间为t,那么,如何安排才能够使得所有见面会的总时间最短? 最简单的办法,就是把m个研究组的见面会时间依次排开,那我们就要用m * t的总时间,我们有10多个研究小组,时间会拖得很长,能否进一步提高效率?

此题的官方解法是将问题转化为一个已知的图的问题:即图的最少着色问题。
http://www.cnblogs.com/Dzhouqi/p/3346466.html
bool ColoringGraph(int G[][5],int n,int m);
bool IsOk(int G[][5],int color[],int k,int n) ;
int G[5][5]={{0,1,1,0,0},{1,0,1,1,1},{1,1,0,0,1},{0,1,0,0,1},{0,1,1,1,0}};
int _tmain(int argc, _TCHAR* argv[])
{
    int n=5,m=3;
    ColoringGraph(G,n,m);
    return 0;
}
bool ColoringGraph(int G[][5],int n,int m)
    //n是图的定点个数,G是图的连接矩阵,Gij=1说明i定点与j定点有连接。m是最多可以上的色
    //若输出有效上色,返回1,否则返回0
{
    int *color=new int[n];
    
    for(int i=0;i<n;i++)//给每个顶点颜色初始化为0
        color[i]=0;
    int k=0;
    while(k>=0)//k代表顶点个数,当k回溯到0说明已经没有可行解了
    {
        while(color[k]<=m)
        {
            color[k]++;
            if (IsOk(G,color,k,n))
                break;
        }
        if(color[k]<=m && k==n-1)
        {
            cout<<"OK";
            for(int j=0;j<n;j++)
                cout<<color[j];
            return 1;
        }
        else if(color[k]<=m && k<n-1)
        {
            k++;
        }
        else//若k>m,说明此路不同回溯到上一层
        {
            color[k]=0;
            k--;
        }
    }
    return 0;
}
bool IsOk(int G[][5],int color[],int k,int n)  //判断是否有相同色的顶点,与之是一个边的
{
    for(int i=0;i<n;i++)
    {
        if(G[i][k]==1 && color[i]==color[k])
            return false;
    }
    return true;
}
http://www.cppblog.com/jake1036/archive/2011/06/30/149815.html
1) 面试的时候,每次会面都有一个开始时间b[i] 和 结束时间e[i] 。
(2) 现在有一组面试时间数据,现在要求每一个有冲突的时间,都不允许安排在
同一个地点,求出最小需要安排的地点数目。

问题分析:
(1) 首先按照开始时间,将面试时间递增排列。
(2) 依次从第一个约会开始时间开始。 const int N = 4 ;
 
struct Time
 
{
    
int begin ; //开始时间 
    int end   ; //结束时间   
       
 }
 ;
 
bool forbit[N] ; //禁止数组,为false的时候,表示当前该颜色可以使用 
 int maxcolors  ; //当前最大的颜色数目 
 Time times[N] ;
 
int color[N] = {0} ;
 
int cmp(const void * a , const void * b)
 
{
     
return ((Time*)a)->begin - ((Time*)b)->begin ;
    
 }

 
void init()
 
{
   
for(int i = 0 ; i < N ; i++)
     
{
       cin
>>times[i].begin>>times[i].end ; //输入开始时间和结束时间      
     }
  
     qsort(times ,N , 
sizeof(Time)  ,cmp) ;
      
//for(i = 0 ; i < N ;i++)
       
// forbit[i] = false ;
 }

 
bool overlap(const Time & a, const Time & b)
 
{
   
if(b.begin >= a.begin && b.begin < a.end )
        
return true ;
   
return false ;
 }

 
int arrange()
 
{
  maxcolors 
= 0 ;    
  
int i , j , k ;
  
for(i = 0 ; i < N ;i++//循环每一个约会安排 
  {
        
    
for(k = 0 ; k < maxcolors ;k++)
    
{
      forbit[k] 
= false ;
    }

    
//判断在i之前的节点是否是与i节点有重合的部分 
     for(j = 0 ; j < i ;j++)
     
{
        
if(overlap(times[j] , times[i])) //判断两者是否相交 
        {
           forbit[color[j]] 
= true ;                         
        }
          
     }
 
     
for(k = 0 ; k < maxcolors ;k++)
     
{
        
if(!forbit[k])
            
break ;
     }

     
if(k < maxcolors)
       color[i] 
= k ;
     
else
       color[i] 
= maxcolors++ ;
  }
  
      
return maxcolors ;
 }


Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts