您的位置:首页 > 其它

喷水装置问题(一)

2015-09-12 16:35 295 查看
描述:

现有一块草坪,长为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

代码实现:

/*
 * main.c
 *
 *  Created on: 2015年9月12日
 *      Author: bobo
 */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

void sort(int sum,float zuis[]);
void print(int sum,float zuis[]);

int main()
{
    /* 样例的组数 */
    int size;
    scanf("%d",&size);

    while(size--){
        int count;  //喷嘴的个数
        scanf("%d",&count);

        double length = 0;   //总长度

        int i;
        float zuis[count];
        for(i = 0;i < count;i++)
            scanf("%f",&zuis[i]);

        sort(count,zuis);

        for(i = 0; i < count;i++){
            float temp = 2 * sqrt(zuis[i] * zuis[i] - 1);//计算横切的草坪的长度
            length += temp;   //计算总长度
            if(length > 20)//如果大于20,说明以及遍布了
                break;
        }

        printf("%d\n",i+1);
    }

    return 0;
}

/* 交换两个数字 */
void swap(float *a,float *b)
{
    float temp = *a;
    *a = *b;
    *b = temp;
}

/* 最简单的排序 */
void sort(int sum,float zuis[])
{
    int m,n;
    for(m = 0;m < sum-1;m++)
        for(n = m+1;n < sum;n++)
            if(zuis
 > zuis[m])
                swap(&zuis[m],&zuis
);
}

/* 测试输出 */
void print(int sum,float zuis[])
{
    int m;
    for(m = 0;m < sum;m++)
        printf("%.1f ",zuis[m]);

    printf("\n");
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: