博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
pku 1328 第一周训练 ——贪心
阅读量:6887 次
发布时间:2019-06-27

本文共 3256 字,大约阅读时间需要 10 分钟。

这个题目就是每个岛屿对应一个雷达区间,然后确定好雷达区间后,然后在将区间的s或者e从小到大排序,然后贪心。

第一种按s从小到大排序:

View Code
#include 
#include
#include
#include
#include
#define maxn 1007 using namespace std; struct node {
int x,y; }tagp[maxn]; struct mode {
double s,e; }tagq[maxn]; int cmp(mode a,mode b) {
return a.s < b.s; } int main() {
//freopen("d.in","r",stdin); int i,n,d; int cas = 1; while (scanf("%d%d",&n,&d)) {
if (!n && !d) break; for (i = 0; i < n; ++i) scanf("%d%d",&tagp[i].x,&tagp[i].y); int flag = 0; for (i = 0; i < n; ++i) {
if (tagp[i].y > d) {
flag = 1; break; } double tmp = sqrt((1.0*d*d) - (1.0*tagp[i].y*tagp[i].y)); double s = 1.0*tagp[i].x - tmp; double e = 1.0*tagp[i].x + tmp; tagq[i].s = s; tagq[i].e = e; } if (flag) {
printf("Case %d: %d\n",cas++,-1); continue; } sort(tagq,tagq + n,cmp); double e = tagq[0].e; int count = 1; for (i = 1; i < n; ++i) {
if (tagq[i].s > e) {
count++; e = tagq[i].e; } else {
if (tagq[i].e < e)//注意新的终点的确定 {
e = tagq[i].e; } } } printf("Case %d: %d\n",cas++,count); } return 0; }

第二中是按e从小到大排序,这里定义int型来接受double型的数据,悲催死我了。。检查了很长时间。。就是经典贪心之会场安排,不过还是有点差别的。

View Code
#include 
#include
#include
#include
#define maxn 1007 using namespace std; struct node {
int x,y; }tagp[maxn]; struct mode {
double s,e; }tagq[maxn]; bool hash[maxn]; int cmp(mode a,mode b) {
return a.e < b.e; } int main() {
//freopen("d.in","r",stdin); int i,count; int n,d; int cas = 1; while (scanf("%d%d",&n,&d)) {
if (!n && !d) break; int flag = 0; for (i = 0; i < n; ++i) {
scanf("%d%d",&tagp[i].x,&tagp[i].y); if (tagp[i].y > d) {
flag = 1; } double tmp = sqrt((1.0*d*d) - 1.0*(tagp[i].y*tagp[i].y)); tagq[i].s = 1.0*tagp[i].x - tmp; tagq[i].e = 1.0*tagp[i].x + tmp; } if (flag) {
printf("Case %d: %d\n",cas++,-1); continue; } sort(tagq,tagq + n,cmp); //for (i = 0; i < n; ++i) //printf("%.2lf %.2lf\n",tagq[i].s,tagq[i].e); int mark; memset(hash,false,sizeof(hash)); count = 0; int j; j = 0; while (1) {
mark = 0; double e = tagq[j].e; for(i = 0; i < n; ++i) {
//printf(">>%.2lf %.2lf\n",tagq[i].s,e); if (!hash[i] && tagq[i].s <= e)//只有起点小于这个区间的终点的才能公用一个雷达 {
hash[i] = true; } } count++; for (i = 0; i < n; ++i) {
if (!hash[i]) {
j = i; mark = 1; break; } } if (!mark) {
printf("Case %d: %d\n",cas++,count); break; } } } return 0; }

转载地址:http://wvtbl.baihongyu.com/

你可能感兴趣的文章
类的静态字段和构造函数
查看>>
TLE之前,没有一个节点叫失败!!!
查看>>
机器学习入门之二:一个故事说明什么是机器学习(转载)
查看>>
利用MySQL存储过程分割字符串
查看>>
wamp环境的安装
查看>>
BZOJ 4025: 二分图
查看>>
使用百度地图实现详细地址自动补全(补全bug''事件只能绑定到一个上的问题')...
查看>>
Emoji表情处理工具类
查看>>
刚刚考过dev401,出去玩了!有时间我把题目给大家贴出来。
查看>>
20145209 《信息安全系统设计基础》第3周学习总结
查看>>
python 进程
查看>>
Grunt插件uglify
查看>>
export 与 export default
查看>>
linux配置网卡
查看>>
正则表达式语法
查看>>
013、Dockerfile构建镜像(2019-01-02 周三)
查看>>
c# mvc如何获取xml文件
查看>>
mongodb Java(八)
查看>>
JavaScript随机数
查看>>
ASP.NET验证控件——RequiredFieldValidator
查看>>