喷水装置

来源:互联网 发布:hadoop DBscan算法 编辑:程序博客网 时间:2024/06/09 18:51

本题要点
1. 当水的半径小于1的时候,不予考虑。因为宽度都覆盖不了,没有用。
2. 只考虑长度即可,即sqrt(半径平方-1的平方)。才能覆盖住全部的草坪。
这里写图片描述

描述
现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0,15)的圆被湿润,这有充足的喷水装置i(1,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 <stdio.h>#include <algorithm>#include <math.h>using namespace std;bool cmp(double a, double b){    if (a > b)        return true;    else         return false;}int main(){    int iTest = 0;    cin >> iTest;    for(int i = 0; i < iTest; i++)    {        int iNum = 0;        cin >> iNum;        double fRi[600];        // read in ridium and sort it        for (int j = 0; j < iNum; j ++)        {            cin >> fRi[j];        }        sort(fRi, fRi+iNum, cmp);        int i= 0, iResult = 0;        double fSum = 0;        while(fSum < 20)        {            if( i < iNum)                fSum += 2 * sqrt(fRi[i]* fRi[i] - 1);            iResult ++;             i++;        }        cout << iResult << endl;    }    system("pause");    return 0;}
原创粉丝点击