zoukankan      html  css  js  c++  java
  • 青子的生日——求能玩的最多游戏项目数



    题目:



    分析:

    根据题目意思,每一个游戏都要错开,不能在同一时间玩两个游戏,那么首先就是要确定第一个要玩的游戏是什么,显然是要先把时间段进行排序,那么无非就两种排法,一种是以开始时间的先后排序,另一种是以结束的时间进行排序。那么现在先分析一下这两种排序。如果以开始的时间点进行排序,那么早开始的游戏可能跨度好几个游戏,所以不能确定是否选取该游戏。可是,如果是以结束时间点排序,那么如果一个游戏的结束时间点比较早,就一定可以选取,所以我们采用第二种排序方法。先按结束时间点从小到大把给出的时间段进行排序,那么排在第一个的肯定是要选择的游戏。确定好第一个游戏后,接下来选取游戏的规则就是要看后一个游戏开始的时间点是否大于等于前一个游戏结束的时间点,如果是,那么就可以选取,否则就跳过。这样,就能玩最多的游戏了。



    代码:

    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n,i,j,t,count=1,right;
        int begin[100],end[100];
    
        cin>>n;
    
        for(i=0;i<n;i++)
    	    cin>>begin[i]>>end[i];                  //分别记录各时间段开始和结束的时间点
    	
        for(i=0;i<n-1;i++)                             //按结束时间从小到大排序
        {
    	    for(j=i+1;j<n;j++)
    	    {
    		    if(end[j]<end[i])
    		    {
    			    t=begin[i];
    			    begin[i]=begin[j];
    			    begin[j]=t;
    			    t=end[i];
    			    end[i]=end[j];
    			    end[j]=t;
    		    }
    	    }
        }
    
        right=end[0];                          //记录上一个游戏结束的时间点
    
        for(i=1;i<n;i++)
        {
    	    if(begin[i]>=right)
    	    {
    		    count++;
    		    right=end[i];
    	    }
        }
    
        cout<<count<<endl;
        return 0;
     } 
    

    **
    **

  • 相关阅读:
    HDOJ 1556 线段树
    POJ 3977 折半枚举
    2017ACM省赛选拔赛题解
    关于四舍五入和截断
    POJ 3422 最小费用最大流
    Codeforces Round #407 (Div. 2) D. Weird journey 思维+欧拉
    POJ 3155 最大密度子图
    无向图最小割 stoer_wagner算法
    最大权闭合子图
    L2-001. 紧急救援 Dijkstra
  • 原文地址:https://www.cnblogs.com/jiuweilinghu/p/5929490.html
Copyright © 2011-2022 走看看