nyoj 题号12 喷水装置(二)——南阳oj

题目信息:

喷水装置(二)

时间限制: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。

样例输入
2
2 8 6
1 1
4 5
2 10 6
4 5
6 5
样例输出
1
2

源码

#include <stdio.h>
#include <math.h>
#include <stdlib.h>

struct QJ
{
	double x, y;
}qj[10000];
int cmp(const void* x, const void* y)
{
	if ((*(QJ*)x).x == (*(QJ*)y).x)
		return (*(QJ*)x).y - (*(QJ*)y).y;
	else
		return (*(QJ*)x).x - (*(QJ*)y).x;
}
int sel(double e, int used)
{
	int s = 0;
	double b = 0, max = 0;
	while (b < e)
	{
		max = 0;
		for (int k = 0; k < used && qj[k].x <= b; ++k)
		{
			if (qj[k].y - b > max)
				max = qj[k].y - b;
		}
		if (0 == max)
			return 0;
		b += max;
		s++;
	}
	return s;
}
int main()
{
	int M, N, i, j, k, num, used;
	int length, width;
	scanf ("%d",&M);
	while(M--)
	{
		used = 0;
		scanf ("%d%d%d",&N, &length, &width);
		for (i = 0; i < N; i++)
		{
			scanf("%d%d", &j, &k);
			if (k * 2 >= width)
			{
				double t = sqrt((double)(k*k - width*width / 4));
				qj[used].x = j - t;
				qj[used++].y = j + t;
			}
		}
		qsort(qj, used, sizeof(qj[0]), cmp);
		//for (i = 0; i < used; i++)
		//	printf("(%.1lf, %.1lf) ", qj[i].x, qj[i].y);
		num = sel(length, used);
		printf("%d\n", num);
	}
	return 0;
}
时间: 2024-11-10 23:05:45

nyoj 题号12 喷水装置(二)——南阳oj的相关文章

nyoj 12——喷水装置二——————【贪心-区间覆盖】

喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪全部润湿. 输入 第一行输入一个正整数N表示共有n次测试数据.每一组测试数据的第一行有三个整数n,w,h,n表示共有n个喷水装置,w表示草坪的横向长度,h表示草坪的纵向长度.随后的n行,

nyoj 12 喷水装置(二)【贪心】+【区间完全覆盖覆盖】

题意:... 这道题就是区间问题三种中的区间完全覆盖问题,不懂的可以看我上一篇也是区间完全覆盖. 直接上代码: #include <stdio.h> #include <math.h> #include <algorithm> using std::sort; struct node{ double le, ri; }s[1005]; int cmp(node a, node b) { return a.le < b.le; } int main() { int

NYOJ 12 喷水装置(二)

pid=12">喷水装置(二) 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 有一块草坪,横向长w,纵向长为h,在它的橫向中心线上不同位置处装有n(n<=10000)个点状的喷水装置,每一个喷水装置i喷水的效果是让以它为中心半径为Ri的圆都被润湿.请在给出的喷水装置中选择尽量少的喷水装置,把整个草坪所有润湿. 输入 第一行输入一个正整数N表示共同拥有n次測试数据. 每一组測试数据的第一行有三个整数n,w,h,n表示共同拥有n个喷水装置,w表示草坪的

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

【南阳OJ分类之大数问题】题目+AC代码汇总

声明:题目部分皆为南阳OJ题目,代码部分包含AC代码(可能不止一个)和标程. 由于大数问题用c/c++写比较麻烦,而Java的大数类又很好用,所以基本为java代码.实际上竞赛很少会考大数问题,因为竞赛是比的算法,而不是语言特性,不过很多都是大数据,数据上千万级别的,所以算法又很关键,显然那和这篇博客也没啥关系. 题目不是太难,大家和本人就权当学习或复习下Java吧O(∩_∩)O~. 该分类南阳oj地址:http://acm.nyist.edu.cn/JudgeOnline/problemset

NYOJ 745 蚂蚁的难题(二)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾).每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈.(

NYOJ 116 士兵杀敌(二) (线段树区间求和)

题目链接:NYOJ 116 士兵杀敌(二) 这一个是线段树的入门级水题,本题要求我们给出某个区间的区间和.这个问题和线段树的单点更新还是基本一致的.只要把单点更新中的值覆盖变为值得叠加,这一题便可以轻松解决了.如果不知道线段树的单点更新,请移步:传送门 [代码如下] #include <stdio.h> #include <string.h> #define MAXN 1<<21 //lg100000 约等于 21 typedef struct{ int left,ri

NYOJ 116 士兵杀敌(二)【线段树 单点更新】

题意:题意很清楚: 策略:如题. 这道题就是简单的线段树应用,据说还可以用树状数组来做,等我学了之后在说吧. 代码: #include<stdio.h> #include<string.h> #define LC l, m, rt<<1 #define RC m+1, r, rt<<1|1 #define LL long long #define MAXN 1000000 LL sum[MAXN<<2]; void PushUp(int rt)

华为上机题汇总(十二)

华为上机题汇总(十二) 注:编译环境为Visual Studio 2012,答案仅供参考. 目录 华为上机题汇总十二 目录 第五十六题 第五十七题 第五十八题 第五十九题 第六十题 第五十六题 56.在中国,形容夫妻恩爱的词汇中,大家用的比较多的就是"夫妻相".所谓"夫妻相",就是两个人看上去比较般配,长相.身材等某些方面有一定的相似度.本题则另辟蹊径,从人的姓名维度,以字母重复个数来寻找最具"夫妻相"的人. 题目中预先给定一组女士的姓名拼音.输