NYOJ 喷水装置(二)
2024-08-27 16:40:13
题目转换成,每个水龙头在横坐标方向上覆盖的长度区间,转换后的问题就有点像会场安排问题了,然后接下来选的方案依据贪心,我们队这些个区间进行排序,依照区间的左端点按从小到大排序,然后从左往右选取,条件是当前区间的左端点在覆盖范围内,右端点最远。如果一次循环覆盖范围没有加大,就证明不能覆盖。
#include<iostream>
#include<cmath>
#include<stdlib.h>
#include<string.h> using namespace std; typedef struct
{
double start;
double end;
}SE; SE a[]; int compare (const void *p1, const void *p2)
{
return (((SE *)p1)->start<((SE *)p2)->start)? :-;
} int main()
{
int T;
cin>>T;
while(T--)
{
int N;
double w, h;
cin>>N>>w>>h;
for(int i=; i<N; i++)
{
double x, r;
cin>>x>>r;
double tem = r*r-((double)h/)*((double)h/);
if(tem>=)
tem = sqrt(tem);
else
tem = ;
a[i].start = x - tem;
a[i].end = x+ tem;
}
qsort(a,N,(sizeof(a[])),compare);
/*for(int i=0; i<K; i++)
{
cout<<a[i].start<<" "<<a[i].end<<endl;
}*/
double st=, en=;
int visit[];
memset(visit,,sizeof(visit));
int num = ;
while(en<w)
{
double endest = en;
for(int i=; i<N; i++)
{
if(visit[i]==&&a[i].start<=en&&a[i].end>endest)
{
endest = a[i].end;
}
}
if(endest>en)
{
en = endest;
num++;
}
else
{
cout<<<<endl;
break;
}
}
if(en>=w)
{
cout<<num<<endl;
}
}
return ;
}
最新文章
- C#微信公众号开发系列教程三(消息体签名及加解密)
- CSS4
- MVC5+EF6 简易版CMS(非接口) 第四章:使用业务层方法,以及关联表解决方案
- 再谈扩展方法,从string.IsNullOrEmpty()说起
- Fibonacci
- 青少年如何使用 Python 开始游戏开发
- DuiLib——第一篇UIManager
- java cpu缓存
- android 休眠唤醒机制分析(三) — suspend
- unity3d教程动态创建简单平面地形
- android从assets读取文件的方法
- Java眼中的XML文件写入
- permutations II(全排列 2)
- asp.net core 集成 log4net 日志框架
- kmp算法 模板
- Spring Boot 初识
- Oracle——存储过程简单入门实例
- k8s单机部署1.11.5
- linux AB web 性能测试工具
- Flask script 内的Shell 类 使用