B 區間選點(編譯器選GNU G )

2021-10-03 13:44:01 字數 1061 閱讀 7207

數軸上有 n 個閉區間 [a_i, b_i]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)input第一行1個整數n(n<=100)

第2~n+1行,每行兩個整數a,b(a,b<=100)output乙個整數,代表選點的數目

21 5

4 63

1 32 5

4 6step0 將輸入的區間範圍按b從小到大且b相同時a從大到小排序

step1 將b最小的區間取出,用指標p記錄

step2 取出第乙個a比前一次取出區間b大的區間,將其p更新為指向該區間

step3 遍歷完所有的區間,輸出點的數量

1、結果錯誤,檢查發現錯誤**部分:

int count=

0,i=

0,p=0;

count++

;while

(i

注意到在最後乙個區間處i會超過n的範圍,可能導致錯誤,且即使不超過n的範圍也會再增一,邏輯錯誤,改正如下:

int count=

0,i=

0,p=0;

count++

;while

(i}

輸出結果正確

該題利用了貪心思想,將區間按b從小到大且b相同時a從大到小排序,這樣用乙個整形指標p遍歷陣列時,每次碰到第乙個不包含已有點的區間時,即為所有區間中所需新放點的最大座標最小的點,不斷取這個點即可得到最少的滿足覆蓋所有區間的點。

將a按從大到小排序可以方便找到b相同時最大的a,方便立即取出無法用已有點覆蓋的區間。

#include

#include

using

namespace std;

struct qujian

}q[1000];

intmain()

sort

(q,q+n)

;int count=

0,i=

0,p=0;

count++

;while

(i} cout<}

B 區間選點(編譯器選GNU G )

數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output 乙個整數,代表選點的數目 examples input 21 5 4 6out...

GNU的g 編譯器備忘

之前編c 都只是用vs2012,現在要開始學習用gnu的g 編譯器,下面是寫著備忘的筆記。windows 上的安裝g 應用說明 程式 g 是將 gcc 預設語言設為 c 的乙個特殊的版本,鏈結時它自動使用 c 標準庫而不用 c 標準庫。通過遵循原始碼的命名規範並指定對應庫的名字,用 gcc 來編譯鏈...

安裝 GNU 的 C C 編譯器

如果您使用的是 linux 或 unix 請在命令列使用下面的命令來檢查您的系統上是否安裝了 gcc g v 如果您的計算機上已經安裝了 gnu 編譯器,則會顯示如下訊息 using built in specs.target i386 redhat linux configured with co...