1. 程式人生 > >噴水裝置 貪心算法

噴水裝置 貪心算法

return highlight main mem space pre 影響 string cstring

噴水裝置(一)

時間限制:3000 ms | 內存限制:65535 KB 難度:3
描述
現有一塊草坪,長為20米,寬為2米,要在橫中心線上放置半徑為Ri的噴水裝置,每個噴水裝置的效果都會讓以它為中心的半徑為實數Ri(0<Ri<15)的圓被濕潤,這有充足的噴水裝置i(1<i<600)個,並且一定能把草坪全部濕潤,你要做的是:選擇盡量少的噴水裝置,把整個草坪的全部濕潤。
輸入
第一行m表示有m組測試數據
每一組測試數據的第一行有一個整數數n,n表示共有n個噴水裝置,隨後的一行,有n個實數ri,ri表示該噴水裝置能覆蓋的圓的半徑。
輸出
輸出所用裝置的個數
樣例輸入
2
5
2 3.2 4 4.5 6 
10
1 2 3 1 2 1.2 3 1.1 1 2
樣例輸出
2
5


#include<iostream>
#include<cstdio>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cmath>
#include<map>
#include<stack>
#include<set>
#include<fstream>
#include<memory>
#include
<list> #include<string> using namespace std; typedef long long LL; typedef unsigned long long ULL; #define MAXN 602 #define INF 1000000009 /* 噴水裝置 用半徑為ri的多個噴水裝置覆蓋 20*2 的長方形區域 考慮四分之一圓對於下半部分的影響!將問題分解考慮: 可以看作用多個半圓將 20*1 長方形覆蓋 可以看作用2*n個四分之一圓將20*1 覆蓋 考慮計算每個四分之一圓能覆蓋的長方形長度即可 x*x + 1 = r*r
*/ int n; double r[MAXN],a[MAXN]; int main() { int T; cin >> T; while (T--) { cin >> n; for (int i = 0; i < n; i++) { cin >> r[i]; if (r[i] > 1) a[i] = sqrt(r[i] * r[i] - 1); else a[i] = 0; } double sum = 20.0; int p = n - 1; sort(a, a + n); while (sum>0) { sum -= a[p--] * 2.0; } printf("%d\n", n - 1 - p); } return 0; }

噴水裝置 貪心算法