乙個小貪心 區間覆蓋問題

2021-09-08 09:15:52 字數 2074 閱讀 8912

乙個小貪心,東西很簡單,但畢竟是自己做的:

時間限制:

3000 ms  |  記憶體限制:

65535 kb

難度:4

描述

有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n(n<=10000)個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。

輸入第一行輸入乙個正整數n表示共有n次測試資料。

每一組測試資料的第一行有三個整數n,w,h,n表示共有n個噴水裝置,w表示草坪的橫向長度,h表示草坪的縱向長度。

隨後的n行,都有兩個整數xi和ri,xi表示第i個噴水裝置的的橫座標(最左邊為0),ri表示該噴水裝置能覆蓋的圓的半徑。

輸出每組測試資料輸出乙個正整數,表示共需要多少個噴水裝置,每個輸出單獨佔一行。

如果不存在一種能夠把整個草坪濕潤的方案,請輸出0。

樣例輸入

228

6114

52106

4565

樣例輸出

1

2

c**如下

1 #include "

stdio.h

"2 #include "

math.h

"3 typedef struct _equip//

區間的結構體

4equip;89

void q_sort(equip **a,int low,int heigh)//

對區間按開始端進行公升序排序

1022

if(i 2327

while(i < j && a[i]->l <= temp->l)

2831

if(i 3236

}37 a[i] =temp;

38 q_sort(a,low,i - 1

);39 q_sort(a,i+1

,heigh);40}

41}42 equip buf[10000

];43 equip *si[10000

];44

45//

尋找從begin開始到end-1之間符合條件的乙個區間

46//

即開始端 <= rc 的所有小區間中結束端最大的那個小區間

47int findmaxr(int begin,int

end)

4856}57

return

k;58}59

intmain()

6079 buf[j].r =x + sqrt(r * r - h * h / 4.0

);80

if(buf[j].r >w)

8184 si[s++] = &buf[j];85}

86}87 q_sort(si,0,s-1);//

從這裡到前邊都是準備工作,後邊開始貪心了

88 rc = 0.0;89

for(j = 0;j < s && rc 90100

}101

int maxr =findmaxr(j,k);

102 count ++;

103 rc = si[maxr]->r;

104 j = maxr +1

;105

}106

else

107110

}111

if(rc 112 printf("

0\n"

);113

else

114 printf("

%d\n

",count);

115}

116}

117 }

mail : [email protected]

乙個小貪心 區間覆蓋問題

描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。輸入第一行輸入乙個正整數n表示共有n次測試資料。每一組測試資料的第...

貪心 區間覆蓋問題

區間覆蓋問題 time limit 1000ms memory limit 65536kb submit statistic discuss problem description 設x1 x2 xn 是實直線上的n 個點。用固定長度的閉區間覆蓋這n 個點,至少需要多少個這樣的固定長度閉區間?對於給...

貪心法 區間覆蓋問題

區間覆蓋問題。數軸上有n個閉區間 a i,bi 選擇盡量少的區間覆蓋一條指定線段 s t 先進行預處理,將不包含 s t 的區間都去掉,然後再按左區間從小到大排序。如果最小區間的左區間大於 s 的話,則無解。選取包含 s的右區間最大的區間,該區間的右區間仍然小於下乙個區間的左區間,則無解。按照這樣的...