噴水裝置(二) 區間長度貪心

2021-08-07 11:28:10 字數 1743 閱讀 4563

描述

有一塊草坪,橫向長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

分析:告訴你噴水的位置和噴射的半徑,你可以求出能覆蓋矩形草坪在水平方向上的長度,即知道每個噴水的左右端點,剩下的就是求在固定區間內問最少多少個小區間能夠覆蓋

#include #include #include #include #include #include #include #include #include #include using namespace std;

double len(double a,double b)

int cmp(paira,pairb)

int main()

}sort(v.begin(),v.end(),cmp);

int cnt = 0;

double right = 0;

while(right < w)

if(m)

else

break;///如果擴充套件不動了,那就說明已經擴充套件完成了

}if(right < w)

cout << 0 << endl;

else

cout << cnt << endl;

}return 0;

}

#include #include #include #include #include #include #include #include #include #include using namespace std;  

double len(double a,double b)

int cmp(paira,pairb)

int main()

} sort(v.begin(),v.end(),cmp);

int cnt = 0;

double right = 0;

int top = 0;

while(right < w)

else if(v[i].first > be)

}if(be > right) break;

else cnt++;

} if(right < w)

//cout << 0 << endl;

printf("0\n");

else

//cout << cnt << endl;

printf("%d\n",cnt);

} return 0;

}

噴水裝置(二) 區間覆蓋問題

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

南陽 12 噴水裝置(二)區間覆蓋問題

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

括號匹配(二)(區間dp)

給你乙個字串,裡面只包含 四種符號,請問你需要至少新增多少個括號才能使這些括號匹配起來。如 是匹配的 是匹配的 是不匹配的 是不匹配的 第一行輸入乙個正整數n,表示測試資料組數 n 10 每組測試資料都只有一行,是乙個字串s,s中只包含以上所說的四種字元,s的長度不超過100 對於每組測試資料都輸出...