喷水装置(一) nyoj 6 && 喷水装置(二)NYOJ_12

来源:互联网 发布:建筑平面设计软件 编辑:程序博客网 时间:2024/04/19 04:52

喷水装置(一)

时间限制:3000 ms  |  内存限制:65535 KB
难度:3
描述
现有一块草坪,长为20米,宽为2米,要在横中心线上放置半径为Ri的喷水装置,每个喷水装置的效果都会让以它为中心的半径为实数Ri(0<Ri<15)的圆被湿润,这有充足的喷水装置i(1<i<600)个,并且一定能把草坪全部湿润,你要做的是:选择尽量少的喷水装置,把整个草坪的全部湿润。
输入
第一行m表示有m组测试数据
每一组测试数据的第一行有一个整数数n,n表示共有n个喷水装置,随后的一行,有n个实数ri,ri表示该喷水装置能覆盖的圆的半径。
输出
输出所用装置的个数
样例输入
252 3.2 4 4.5 6 101 2 3 1 2 1.2 3 1.1 1 2
样例输出
25
          // 贪心算法

 #include <stdio.h>#include <stdlib.h>#include <math.h>int cmp(const void *a,const void *b){return *(double *)b >*(double *)a ? 1 : -1;}int main(){int n;scanf("%d",&n);while(n--){int m,i;double a[600];scanf("%d",&m);for(i=0;i<m;i++){scanf("%lf",&a[i]);//printf("%2.lf",a[i]);}qsort(a,m,sizeof(double),cmp);double sum=0.0;int t=0;for(i=0;i<m;i++){sum+=sqrt(a[i]*a[i]-1);t++;if(sum>=10)break;}printf("%d\n",t);}return 0;}        



喷水装置(二)时间限制:3000 ms  |  内存限制:65535 KB难度:4描述    有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿。请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿。输入    第一行输入一个正整数N表示共有n次测试数据。    每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度。    随后的n行,都有两个整数xi和ri,xi表示第i个喷水装置的的横坐标(最左边为0),ri表示该喷水装置能覆盖的圆的半径。输出    每组测试数据输出一个正整数,表示共需要多少个喷水装置,每个输出单独占一行。    如果不存在一种能够把整个草坪湿润的方案,请输出0。样例输入22 8 61 14 52 10 64 56 5样例输出    1    2

#include <stdio.h>#include <stdlib.h>#include <math.h>struct Node{double lef;double rig;}s[10001];int cmp(const void *a, const void *b){Node * c = (Node *)a;Node * d = (Node *)b;if(c->lef > d->lef){return 1;}else{return -1;}}int main(){int n,w,h,t;scanf("%d",&t);while(t--){scanf("%d%d%d",&n,&w,&h);int i,x,r,t;for(i=0;i<n;i++){scanf("%d%d",&x,&r);if(r<h/2)  continue;t = sqrt(r*r-h/2*h/2);s[i].lef = x - t;s[i].rig = x + t;}int ans = 0 ,f = 1;double sum = 0, max = 0;qsort(s,n,sizeof(s[0]),cmp);while(sum<w){max = 0;for(i=0;i<n;i++){if(s[i].lef<=sum && max<s[i].rig-sum){max = s[i].rig - sum;}}if(max==0){f = 0;break;}ans ++ ;sum += max;}if(f)printf("%d\n",ans);else printf("0\n");}return 0;}        


0 0
原创粉丝点击