R的农场
R的农场
题目描述
最近,R 终于获得了一片他梦寐以求的农场,但如此大的一片农场,想要做好防卫工作可不是一件容易的事。所以 R 购买了 N 个守卫,分别让他们站在一定的位置上(守卫不可移动,同一位置上至多有一个守卫)。但是,安排了所有的守卫之后,R 才发现,守卫们彼此十分厌恶。经 R 研究,当某两个守卫距离≤K,他们就会发生争吵;但是,想要守卫们和解也是不难的——只需要 R 给出的平均工资能使两人满意,他们就会同意和解、成为
朋友;当然,如果两个守卫有共同的朋友,他们也会和解成为朋友。R 非常不想守卫们争吵,因此他想找出,在能使所有守卫闭嘴的前提下,平均工资的最小值是多少。他想到了一个绝妙的方法,但他忙着去 Farm,没时间,所以这个任务就交给你了。输入
输入
第1 行为三个数 N, M, K。
接下来 N 行为 N 个守卫的位置,每行包含两个实数 x, y (x≥0, y≥0)。
接下来 M 行,每行三个数,u, v, w,代表若平均工资≥w,则 u 和 v 同意和解。
输出
输出文件有且仅有一行,一个实数 p,代表最小的平均工资。
输入输出样例
chebnear.in
5 5 1.300
1.000 1.000
2.000 3.000
3.000 2.000
2.500 6.000
6.000 3.000
2 4 1.500
5 3 2.350
1 4 0.500
4 5 2.250
3 2 3.200
chebnear.out
2.350

反思
本来想用二分答案做到,虽然我确实这么做了,但是由于我没有写完立刻就编译,想着先写后面的再来写,结果......,没有写完,我觉得我写题都要写出毛病来了,每次打完道题目,总有七七八八的东西导致我编译过不了,特别是考试的时候,编译改错要花我好久的时间..
思路
这题的思路其实我还是懂了的
1.我们二分平均工资,把那些权值满足小于等于工资的点之间连上线(其实就是用并查集归类然后再去染色,相当与联通块的染色)
2.我们染色过后,根据最近点对(最近点对就是我们先按x即横坐标排序,求出中线,那么求点之间的最短距离只可能有3种情况1.在中线左边2.在中线右边3.跨过中线相连我们可以先算出2边的最短点对之间的距离,然后我们以这个距离为标准,向左向右分别寻找在该距离之内的点,然后判断就可以了,tips,这个也是递归实现的,因为我们在寻找左右的最短点对时,左右就相当与2个独立的区间,然后我们就在区间内寻找............),我们就可以判断该工资是否合法(如果2给点是相同颜色的,我们就不会更新)
3.最后我们二分寻找答案确定了答案的精度,输出就可以啦!
代码
感觉自己要死了,写了一个晚上,还是木有写出来,我觉得我的思路一点毛病也没有,为什么就是错了!!
先放一份错的,保存一下今天晚上的"成果"!!
OK啦OK啦,我写完啦
我知道为什么我错了!!原来我把题目意思都理解错了!!!!!!!!!我是真心佩服我自己/(ㄒoㄒ)/~~
#include<bits/stdc++.h>
#define ll long long
#define FOR(i,a,b) for(register int i=a;i<=b;i++)
#define ROF(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
int n,m;
double K;
double maxx=;
int ans;
int fa[];
int tmpt[];
struct ss
{
int x,y;
double p;
}b[];
struct ss1
{
double X,Y;
int num;
}a[],c[];
int scan()
{
int as=,f=;
char c=getchar();
while(c>''||c<''){if(c=='-') f=-;c=getchar();}
while(c>=''&&c<=''){as=(as<<)+(as<<)+c-'';c=getchar();}
return as*f;
}
int ba(int x) {return fa[x]=((fa[x]==x)?x:ba(fa[x]));}
bool cmp(ss1 i,ss1 j) {return i.X<j.X;}
bool cmp2(ss1 i,ss1 j) {return i.Y<j.Y;}
bool cmp3(ss i,ss j) {return i.p<j.p;}
bool clst(int l,int r)
{
int mid=(l+r)>>;
if(l>=r) return ;
if(!clst(l,mid)||!clst(mid+,r)) return ;
int k=;
while(a[l].X+K<a[mid].X) l++;
while(a[r].X-K>a[mid].X) r--;
FOR(i,l,r) c[++k]=a[i];
sort(c+,c+k+,cmp2);
FOR(i,,k)
{
FOR(j,i+,k)
{
if(c[j].Y-c[i].Y>K) break;
if(ba(c[i].num)!=ba(c[j].num))
{
if(abs(c[i].X-c[j].X)<=K)
return ;
}
}
}
return ;
}
bool chek(int mid)
{
FOR(i,,n) fa[i]=i;//父亲的赋值
FOR(i,,m)
{
if(b[i].p>b[mid].p) break;
int f1=ba(b[i].x),f2=ba(b[i].y);//父亲的赋值
if(f1!=f2)
fa[f1]=f2;
}
return clst(,n);
}
int main()
{
n=scan();m=scan();
scanf("%lf",&K);
FOR(i,,n) scanf("%lf%lf",&a[i].X,&a[i].Y),a[i].num=i;
sort(a+,a+n+,cmp);//按照X的关键字排序
FOR(i,,m)
{
b[i].x=scan();b[i].y=scan();scanf("%lf",&b[i].p);
}
sort(b+,b+m+,cmp3);//按照和解费排序
int l=,r=m-;
while(l<=r)
{
int mid=(l+r)>>;
//cout<<mid<<endl;
if(chek(mid))
{
// cout<<"NBV"<<" "<<mid<<endl;
r=mid-;
}
else l=mid+;
}//zh这个二分其实不是很懂...
// cout<<ans-1<<endl;
printf("%.3lf",b[l].p);
}
//找了半天发现是排序的错,我也是佛系了.......
R的农场的更多相关文章
- R的农场 chebnear
评测传送门 Description最近,R 终于获得了一片他梦寐以求的农场,但如此大的一片农场,想要做好防卫工作可不是一件容易的事.所以 R 购买了 N 个守卫,分别让他们站在一定的位置上(守卫不可移 ...
- R 的农场 chebnear (二分答案+最近平面点对)
题面 \(solution:\) 这道题想到二分答案应该是不难的,因为题目是求平均工资的最小值,这个显然具备单调性: 我们设平均工资的最小值为ans,如果我们现在的平均工资x小于ans那么将x带入题目 ...
- [原]CentOS7安装Rancher2.1并部署kubernetes (二)---部署kubernetes
################## Rancher v2.1.7 + Kubernetes 1.13.4 ################ ##################### ...
- 利用python进行数据分析2_数据采集与操作
txt_filename = './files/python_baidu.txt' # 打开文件 file_obj = open(txt_filename, 'r', encoding='utf-8' ...
- Django项目:CRM(客户关系管理系统)--81--71PerfectCRM实现CRM项目首页
{#portal.html#} {## ————————46PerfectCRM实现登陆后页面才能访问————————#} {#{% extends 'king_admin/table_index.h ...
- 【BZOJ】3436: 小K的农场
3436: 小K的农场 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 938 Solved: 417[Submit][Status][Discuss ...
- [swustoj 771] 奶牛农场
奶牛农场 Description 将军有一个用栅栏围成的矩形农场和一只奶牛,在农场的一个角落放有一只矩形的箱子,有一天将军要出门,他就把奶牛用一根绳子套牢,然后将绳子的另一端绑到了那个箱子不靠栅栏的角 ...
- 2014.7.7 模拟赛【小K的农场】
3.小K的农场(farm.pas/cpp/c) [题目描述] 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三 ...
- 2014.8.3情人节欢乐赛【Benny的农场】
Benny的农场 (farm.pas/.c/.cpp) 时间限制:1s.空间限制:128MB 题目描述: Benny有一片农田需要灌溉.农田的形状为矩形,并被分为许多小块.每一块中都有一些水管.共有1 ...
随机推荐
- Java之枚举笔记(Enum)
package com.simope.ljm; public class MyEnum { public static void main(String[] args) { System.out.pr ...
- 云计算之路-阿里云上:原来“黑色0.1秒”发生在socket读取数据时
在昨天的博文(云计算之路-阿里云上:读取缓存时的“黑色0.1秒”)中我们犯了一个很低级的错误——把13ms算成了130ms(感谢陈硕发现这个错误!),从而对问题的原因作出了错误的推断,望大家谅解! 从 ...
- Qt Qwdget 汽车仪表知识点拆解8 淡入效果
先贴上效果图,注意,没有写逻辑,都是乱动的 看下面的开始,开始的时候有一个带入的效果,这里有一个坑, 网上大部分都是调用下面这个函数 setWindowOpacity(); 但是,你会发现,在你的子窗 ...
- Qt 飞机仪表显示
使用Qt简单谢了一个飞机的一小部分仪表,还没有写完,目前只写了一个界面,不过思想应该是一样的. 效果图如下 其中主要由转速表,和下面的部分数字显示构成 转速表代码 .h文件 #ifndef CONTR ...
- python 基础篇03
本节主要内容:1. python基本数据类型回顾2. int----数字类型3. bool---布尔类型4. str--- 字符串类型一.python基本数据类型1. int ==> 整数. 主 ...
- 用Fluent实现MySQL到ODPS数据集成
安装ruby 首先通过 /etc/issue 命令查看当前使用centos是哪个版本: [hadoop@hadoop03 ~]$ cat /etc/issue 由于centos版本是6.6,安装ru ...
- Week9 Teamework from Z.XML-Scenario testing
关于场景测试 About Scenario testing 一.关于用户(About Personas) 1 我们如何预期我们的用户对我们的软件的使用 (How do we expect diff ...
- lintcode-124-最长连续序列
124-最长连续序列 给定一个未排序的整数数组,找出最长连续序列的长度. 说明 要求你的算法复杂度为O(n) 样例 给出数组[100, 4, 200, 1, 3, 2],这个最长的连续序列是 [1, ...
- el-upload怎么拿到上传的图片的base64格式
这里只是本地上传,拿图片的base64,并不向后台直接上传,拿到base64后手动上传 上传前效果: 上传后效果: .vue <el-form-item label="礼品封面&quo ...
- windows服务那些事
前一段时间由于项目需求,写了一个windows服务.下面总结如下: windows服务其实就是一些后台程序,和其他程序的主要区别是它运行于系统后台.微软公司为了方便我们自己定制我们的服务,提供了很多借 ...