程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> uva 10020- Minimal coverage (貪心思想 簡單區間覆蓋)

uva 10020- Minimal coverage (貪心思想 簡單區間覆蓋)

編輯:C++入門知識

題目大意:給出一個范圍M,然後給出若干的區間,以0 0 終止, 要求用最少的區間將0 ~M 覆蓋,輸出最少個數以及方案。

解題思路:典型的區間覆蓋問題,算法競賽入門經典P154上有講。

/*author: charkj_z */
/*time: 0.108s */
/*rank: 674 */
/*為什麼不把沒用的地方去掉? 因為去掉了我覺得不像我能寫出來的*/
/*Ac code : */

#include
#include
#include
#include
using namespace std;
const int maxn=100010;
struct qujian
{
    int x;
    int y;
}s[maxn];

bool cmp(const qujian a,const qujian b)
{
    if(a.x!=b.x) return a.xorder)
                break;
            max=0;
            int k;
            for(int k=0;kbegin)
                /*對於開始和中間每一步,這個判斷都是適合的
                若當前最靠左的區間左端點已經超出所覆蓋區間右端點,無法繼續覆蓋*/
                {
                    k--;
                    printf("k = %d\n",k);
                    break;
                }
                if(s[i+k].y>max)
                /*在上面的if的前提下,即可以覆蓋的前提下,找出可用區間中區間最靠右的區間
                更新最當前最大值,同時用id記錄下該區間坐標*/
                {
                    max=s[i+k].y;
                    id=i+k;
                }
            }
            if(k>0)/*直接跳過在上面循環中去掉的不符合的區間*/
                i+=k;
            if(max=order)/*邊界條件,達到此條件時覆蓋成功,跳出循環*/
                break;
        }
        /*輸出格式不解釋*/
        if(max>=order)
        {
            printf("%d\n",cnt);
            for(int i=0;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved