これが貪欲な考えであることは間違いありません。それは、活動の配置の問題の拡張であるべきです、
この質問の実践は次のとおりです。
1.すべての牛が草を食べ始める時間で並べ替えます
2.小さなルートパイルを使用して、すべての囲いの最後の牛が放牧する現在時刻を維持します。
3.現在の牛を一番上の囲いに配置できる場合は、その中に配置します。それ以外の場合は、新しい囲いを作成します
反証法では、必要な囲いの数を少なくするスキームがあり、必要な囲いの数はmであると想定しています。
上記の方法を考えると、m + 1番目の囲いが新しく建てられた瞬間、現在i番目の牛が処理されていると想定できます。
すべての牛は開始時刻の昇順で並べ替えられるため、最初のmストールの最後の牛の開始時刻は、ii牛の開始時刻以下でなければなりません。
そして、最初のmストールの最小終了時間はiith牛の開始時間以上であるため、最初のmストールの最後の牛の放牧間隔にはi番目の牛の開始時間が含まれている必要があるため、 m + 1間隔の交差があるため、少なくともm + 1の囲いが必要であり、これは矛盾しています。
したがって、上記の方法は最適解を取得して証明することができます。
最小終了時間が満たされていない場合、追加できるのは新しい囲いのみです。
コードを貼り付けます
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <queue> 5 名前空間 std を使用 。 6 typedefペア< int、int > PII; 7 const int N = 5e5 + 5; 8 int n、id [N]; 9 10ペア<PII、int >牛[N]; 11 12 int main(){ 13 cin >> n; 14 for(int i = 0; i <n; ++ i){ 15 cin >> cows [i] .first.first >> cows [i] .first.second; 16 cows [i] .second = i; 17 } 18 19 sort(cows、cows + n); //開始時間による取り決めとして、選別、および同様のアクティビティ 20である <PII、ベクトル<PII>、大<PII >>ヒープPRIORITY_QUEUE; //これは、各ストールの最小終了時刻の小さなヒープルート維持するために使用されている 21ことである ため(INT I = 0 ; i <n; ++ i){ 22 if(heap.empty()|| heap.top()。first> = cows [i] .first.first){ //貪欲によれば、最小値がいつ終わるかを証明できます時間が条件を満たしていない場合は、新しい 23 PIIストール= make_pair(cows [i] .first.second、heap.size()); 24 id [cows [i] .second] = stall.second + 1; 25を追加する必要があります heap.push(stall); 26 } 27 else { 28 auto stall = heap.top(); 29 heap.pop(); 30 stall.first = cows [i] .first.second; 31 id [cows [i] .second] = stall.second + 1; 32 heap.push(ストール); 33 } 34 } 35 cout << heap.size()<< endl; 36 for(int i = 0; i <n; ++ i)cout << id [i] << endl; 37は 0を返します。 38 }