區間選點
數軸上有 n 個閉區間 [a_i, b_i]。取盡量少的點,使得每個區間內都至少有乙個點(不同區間內含的點可以是同乙個)
input
第一行1個整數n(n<=100)
第2~n+1行,每行兩個整數a,b(a,b<=100)
output
乙個整數,代表選點的數目
解題思路
定義乙個結構體,把每個區間的左右都記錄下來。尋找乙個貪心演算法。我先在結構體內過載了小於號便於排序sort,把這些區間按右端點從小到大排序,至於相等的時候,左端點怎麼排都可以,我們不關心。
然後就開始遍歷,令乙個r等於當前區間由端點的值,然後尋找後面區間的左端點大於r的 區間,這樣,該區間前面的所有區間,都有共同的點(至少有r這個點吧),然後在把新的區間的右端點賦值給r,迴圈。
**實現
#include
#include
using
namespace std;
struct p};
p p[
100]
;int
main()
sort
(p,p+n)
;int r;
//用來裝右點的
int ri =1;
//右點切換次數就是有多少個點
r = p[0]
.r;for
(int i=
1;i)//更換右點
// cout<
cout<
return0;
}
小結該題寫下來後其實看起來並不難,但是尋找貪心策略的思路還挺難的。 區間選點 Gym 270437B
數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output乙個整數,代表選點的數目examples input 21 5 4 6output...
B 區間選點
數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 乙個整數,代表選點的數目。input 21 5 4 6output 1input 31 3 2 54 6...
B 區間選點
數軸上有 n 個閉區間 a i,b i 取盡量少的點,使得每個區間內都至少有乙個點 不同區間內含的點可以是同乙個 input 第一行1個整數n n 100 第2 n 1行,每行兩個整數a,b a,b 100 output 乙個整數,代表選點的數目examples input 2 1 54 6outp...