日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贪心算法之——喷水装置二(nyoj12)

發布時間:2025/3/16 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心算法之——喷水装置二(nyoj12) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目描述:

噴水裝置(二)

時間限制: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 1 4 5 2 10 6 4 5 6 5
樣例輸出
1 2


分析:

這是貪心中區間覆蓋的問題:

數軸上有n個閉區間[ai,bi],選擇盡量少的區間覆蓋一條指定線段[s,t].(而這一題的變化在于要先對數據進行處理把圓心和半徑,轉換成區間的[ai,bi])

本題的突破口在與區間包含和排序掃描,把各區間按照a從小到大排序。如果區間1的起點不是<=s,無解(因為其他區間的起點更大,不可能覆蓋到s點),否則選擇起點在s(或s之前)的右端點b最大的區間。選擇此區間[ai,bi]后,新的起點應該設置為s=bi。然后繼續向后掃描,直到所有區間掃描完畢,判斷選擇的最后一個區間的右端點bi是否小于t,小于則無解。

源碼:

#include <stdio.h> #include <math.h> #include <algorithm> using namespace std; typedef struct line {double left, right; }Line;bool cmp(Line l1,Line l2) {return l1.left < l2.left; } int main() {int t;scanf("%d", &t);while(t--){Line l[10005]={0};int n, w, h;double x, r;scanf("%d%d%d", &n, &w, &h);for(int i=0; i<n; i++){scanf("%lf%lf", &x, &r);if(2*r>h){double temp = sqrt(r*r-h*h/4.0);l[i].left = x-temp;l[i].right = x+temp;}}sort(l, l+n, cmp);double start=0.0;if(l[0].left>start) puts("0"); //如果區間1的起點不是<=start,無解else{int i=0,max=0,cnt=0;while(1){for(; i<n; i++){if(l[i].left<=start){//選擇起點在start(或start之前)的右端點b最大的區間if(l[i].right>l[max].right) max = i; }else break;}start = l[max].right;if(l[i].left>start) {puts("0"); break;}cnt++;//判斷選擇的最后一個區間的右端點bi是否小于w,小于則無解。if(i==n && l[max].right<w) {puts("0"); break;} if(start>=w) {printf("%d\n", cnt); break;}}}} return 0; }

題目鏈接:http://acm.nyist.net/JudgeOnline/problem.php?pid=12


總結

以上是生活随笔為你收集整理的贪心算法之——喷水装置二(nyoj12)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。