UVA 10382 貪心 最少圓

2021-08-08 04:12:13 字數 730 閱讀 6090

題目:

給你一塊草地,有長,寬,給你n個噴頭,每個噴頭給出中心和噴灑範圍。求覆蓋這片草地的最小碰頭數量。

思路:這是經典的貪心題,從左到右,把所有噴頭排序,現在第乙個噴頭的最右邊距離為right,找到剩下噴頭中噴頭能覆蓋right的,且噴頭右邊的距離最大的噴頭,然後更新最右邊的距離right。

這裡注意計算噴頭覆蓋的距離時不能直接取半徑,要用下餘弦定理。半徑小於草地的寬的一半的噴頭直接報廢。

#include#include#include#includeusing namespace std;

struct node a[10005];

bool cmp(node a, node b)

int main()

sort(a, a + temp, cmp);

double left = 0, right = 0;int sum = 0;

if (a[0].x <= 0)

if (j == i)

break;

left = right;

i = j;

sum++;

if (left >= l)

break;

}} if (left >= l)

cout << sum << endl;

else

cout << -1 << endl;

} return 0;

}

uva 10382題解(貪心)

題目大意 有一塊草坪,長為l,寬為w,在它的水平中心線上有n個位置可以安裝噴水裝置,各個位置上的噴水裝置的覆蓋範圍為以它們自己的半徑ri為圓。求出最少需要的噴水裝置個數。8 20 2 5 34 1 1 27 2 10 2 13 3 16 2 19 4 3 10 1 3 59 3 6 13 10 1 ...

uva 10382 貪心 區間覆蓋問題

include stdio.h include cmath include algorithm include iostream using namespace std struct sgm a 10000 500 int main sort a,a cnt if cnt 0 a 0 l 0 a 1...

UVA 10382 (區間貪心)

注意每個圓管轄的區間不是最左或最右的端點而是和被覆蓋圖形的交點。直接按照每個圓的left排序 每次盡量尋找靠右的就可以了。include include include include include include include include include include include i...