ACM 噴水裝置(一)

OpenSoucre發表於2014-04-07

噴水裝置(一)

時間限制: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 <vector>
#include <algorithm>
#include <cmath>
using namespace std;

int main(){
    int T;
    cin >>  T;
    for(int icase = 0 ; icase < T; ++icase){
        int n;
        cin >> n;
        vector<double> r(n);
        for(int i = 0; i < n ; ++ i)
            cin >>  r[i];
        sort(r.begin(),r.end());
        int res = 0,index = r.size()-1;
        double len = 0;
        while(len < 20){
            double a = 2*sqrt(r[index]*r[index] - 1);
            len +=a;
            index--;
            res++;
        }
        cout<<res<<endl;
    }
}

 

 

相關文章