nyoj 12 噴水裝置(二)

2021-06-27 21:46:01 字數 1312 閱讀 7904

時間限制:

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。

樣例輸入

2

2 8 6

1 14 5

2 10 6

4 56 5

樣例輸出

1

2

又一道貪心,早晚征服它!!!花了好幾個小時才ac,錯了7次...但能ac真的很開心!  純自己的思路,大神路過勿噴。

#include#include#includeusing namespace std;

struct record

num[100100];

bool cmp(record a,record b)

//按起點公升序排列,如果起點相同,按終點降序排列

int main()

num[m].end=x[i]+sqrt(r[i]*r[i]-(double)h*h/4);//把覆蓋半徑大於縱長一半的起點終點求出來

if(num[m].start==0)//判斷有沒有起點從0開始的

k=1;

if(num[m].end>=w)//判斷有沒有終點大於或等於草坪長度的

l=1;

m++;

}} if(k==0||l==0)//如果不滿足起點=0,終點》=w

printf("0");

else

}if(g==0)//遍歷所有裝置都不能接上上乙個裝置

break;

}if(he>=w)

printf("%d",sum);

else

printf("0");

} printf("\n");

} return 0;

}

nyoj 12 噴水裝置(二)

這道題是一道典型的貪心,可以轉化為區間覆蓋問題。首先把圓的覆蓋轉化成線段,草坪轉化為定長線段。即轉化成直線上的線段覆蓋問題,就是求用最少的線段數把整個區域都覆蓋了,不能覆蓋的輸出0。這道題做的有點慢,主要是細節沒注意好。用了好幾個測試資料才改正過來的。我的錯主要是處在len的計算上了,沒注意到len...

NYOJ 12 噴水裝置(二)

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有一塊草坪,橫向長w,縱向長為h,在它的橫向中心線上不同位置處裝有n n 10000 個點狀的噴水裝置,每個噴水裝置i噴水的效果是讓以它為中心半徑為ri的圓都被潤濕。請在給出的噴水裝置中選擇盡量少的噴水裝置,把整個草坪全部潤濕。...

NYOJ 12 噴水裝置(二)

此題應轉化為區間覆蓋問題,數軸上有 n 個閉區間 ai,bi 選盡量少的區間覆蓋一條指定線段 s,t 掃瞄結果 1.線段上有的區間覆蓋不到,則無法完成覆蓋,跳出掃瞄迴圈 2.選擇能覆蓋到 sum 位置且最長的閉區間,用它來覆蓋,貪心,保證選的區間少,sum q i b sum。如下 include ...