描述:
现有一块草坪,长为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#include #include 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[n] > zuis[m]) swap(&zuis[m],&zuis[n]);}/* 测试输出 */void print(int sum,float zuis[]){ int m; for(m = 0;m < sum;m++) printf("%.1f ",zuis[m]); printf("\n");}
运行结果: