[アルゴリズム]貪欲_プログラムのスケジューリング問題

 

 

問題の説明
  「この夏は学びません?」
  「そうなの?何をするつもりですか?」
  「うんテレビを見て!」
  「あなたは非常に多くのテレビ番組がまだ終わって見ます?」
  「ああはい、そのプログラムを手配良いことだ。」
  確かに、夏が来て、ドラマのホリデーシーズンが来た、多くのテレビファンがテレビに向かって脇に学業を置くだろうと推定しています。テレビファンとして、私たちはドラマの一日にできるだけ多くを見たいと思っています。もちろん、良い若者の新しい時代として、あなたはまた、良い時代は、長安12時間、請願の受注、および王小鴨を流れる電流(国事を懸念していることを忘れてはありません)、このようなニュースネットワークなど、いくつかの他のプログラムを見なければならない「幸せ辞書「というように、あなたはすでにあなたはすべてのテレビ番組の放送スケジュールを見るのが好き知っていると仮定すると、あなたはそれを手配しますか?(目標は、完全なプログラムの多くを見ることがあります)
 
 
エントリー
  試験例の複数を含む入力データは、各テストケースのみ1個の整数N(N <= 100)の最初の行は、各列が2つのデータTi_sを含む、あなたが好きなプログラム、n個の行の合計数を表しTi_e(1 <= iが= Nを<)問題、正の整数で各時間を簡単にするために、i番目の番組の開始時刻と終了時刻を表します。n = 0の処理を行わず、入力終了を表します。
 
 
輸出
  各テストケースのために、出力の数は、完全なテレビ番組、別の行の各テストケースの出力を見ることができます。
 
 
サンプル入力
  12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
 
 
サンプル出力
  5
 
 

問題解決のためのアイデア

  これは、間隔を決定し、その後、互いに素な数までの合計が含まれ、この部分区間部で求め、異なるサブインターバルを入力された全長を与えます。

  あなたのような、これらのサブ間隔が今交差しない与えられた、つまり、ほとんど例外的な状況を考えることができます

  -----(1,3)1

             ----------(2,4)2

                                --------(5,7)3

                                               -----------------(8,10)4

  0-10は、我々は、左側部4に移動した場合、その後ばらばら部分区間の数が最大になり、一般的なものから特定し、maxが4つの互いに素サブインターバルの合計=、この一般的な範囲で見ることができます3、1他の移動部分区間が、値maxをもたらすであろうことは小さく(セクションと別のサブレンジを交差する動きをもたらす)、または変化しない場合セクションは移動しない(、同じ理由を与えるために、低減されます)他のセクションと交差してつながる、我々は通常の状況下での例最適解は、この形式の特殊な状況に最も類似しているべきであると結論付けることができます。即ち、ケースが最適解であるべきである(この条件によって決定されるように横切ることができる)、出発点は、第一のサブインターバルのサブインターバルの第二の端部よりも大きい、それはサブインターバルを要求されるので、従って、それらは交差しないことを確実にしますそれは最も早い最新の開始端であるため、特定の行が並べ替え後秩序は、ソートの大端部に小さなに置く、最小間隔は、(最適解が内部に含まれている必要があり、上記の例の端から得ることができます左端の範囲)。

 

  

 

する#include <stdio.hの>
 構造体タイム
{ 
INT Ti_s;     // 時間開始
INT Ti_eを;     // 終了時刻
};
 int型のmain()
{ 
    int型COUNT、A、I、Jを、
    時間時間[ 100 ]、TEMP;     // TVは表現するために構造の総数を示す
    しばらく(scanfの(" %のD "、&​​A)はEOF && A =!= 0 
    { 
    ための(I = 0 Iは++; Iは< 
    scanfの(" %D%以下のD " [、&タイムI] .Ti_s、&時間[I] .Ti_e); 
 
     //は、番組終了時間に従ってソート昇順
    以下のための(I = 0 ;私は<; I ++ のための(I = J + 1。 ; J <; J ++ 
         { 
            IF(時間[I] .Ti_e>時間[J] .Ti_e ||(時間[I] .Ti_e時間== [J] && .Ti_e時間[I] .Ti_s> 時間[J] .Ti_s))
            { 
                TEMP = 時間[I]、
                時間[I] = 時間[J]、
                時間[J] = TEMP; 
            } // TEMP構造は、番組の開始時刻終了時刻保持
         } 
 
        ための(I = 1、J = 0、=カウント1。 ; Iは<; Iは++します
        {
            IF(時間[I] .Ti_s> = 時間[J] .Ti_e)
            { 
            COUNT ++ 
            J = I; 
               } 
        } // 貪欲アルゴリズム、最初のプログラムは確かにソート依存し、次いで順次、次のプログラムを算出しますプログラムのプログラム番号の終了時間以上開始時間 
        のprintf(%d個の\ N- ;、COUNT)
    } 
    
 戻り 0 ; 
}
コードの表示

 

 

おすすめ

転載: www.cnblogs.com/1138720556Gary/p/11371910.html