乙個小貪心,東西很簡單,但畢竟是自己做的:
時間限制:
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。
樣例輸入
2286114
52106
4565
樣例輸出
12
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的右區間最大的區間,該區間的右區間仍然小於下乙個區間的左區間,則無解。按照這樣的...