这道题,先讲一下我的做题思路

这道题的最主要的目的就是算出中心,我下面称为中点。这个中点其实很好算的,我们只需要算出最左下角的坐标和最右上角的坐标,然后用中点坐标公式算出来就ok了,那么这道题就做完了一半

中点坐标公式:

\(x_{mid}=(x_{min}+x_{max})/2\)

\(y_{mid}=(y_{min}+y_{max})/2\)

那么剩下的一半就是如何就算无解的情况了,首先这个中点我们已经算出来了,如果有什么疑惑的可以自己手模一下

对于无解的情况,我们对于\((x_i,y_i)\),若此时中点为\((x_{mid},y_{mid})\),那么这个点关于中点的中心对称之后的点就是\((2*x_{mid}-x_i,2*y_{mid}-y_i)\)

这个时候对于这个中心对称之后的点,我们只需要\(O(n)\)扫一下就可以了

那么给出第一份程序

#include<bits/stdc++.h>
#define MAXN 50000
#define INF 100000
using namespace std;
double n;
struct node{
double x,y;
}a[MAXN];
double minx=INF,miny=INF,maxx=-INF,maxy=-INF;
double sx,sy;
bool find(double x,double y){
for(register int i=1;i<=n;i++){
if(a[i].x==x&&a[i].y==y) return true; //O(n) 扫一下
}
return false;
}
bool check(){
for(register int i=1;i<=n;i++){
double x=a[i].x,y=a[i].y;
if(find(2*sx-x,2*sy-y)==false) return false; //如果找不到中心对称之后的点,说明不行
}
return true;
}
int main(){
scanf("%lf",&n);
for(register int i=1;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
minx=min(minx,a[i].x);
miny=min(miny,a[i].y);
maxx=max(maxx,a[i].x);
maxy=max(maxy,a[i].y);
}
sx=(double)(maxx+minx)*1.0/2;
sy=(double)(maxy+miny)*1.0/2;
//算出中点
if(check()==false){
puts("This is a dangerous situation!");
}else printf("V.I.P. should stay at (%.1f,%.1f).",sx,sy);
return 0;
}

然后就会发现这个程序跑出来慢得离谱,我的是\(2.9s\),因为每一次查找确实需要用掉太多时间,那如何去优化这个时间呢

我们可以对于所有的坐标进行排序,以\(x\)为第一关键字,\(y\)为第二关键字,那么我们的\(check()\)函数只需要循环\(1\)~\((n+1)/2\),然后我们的\(find()\)函数只需要循环\(n\)~\((n+1)/2\),这是运用了中心对称的性质,这样优化之后的程序是\(600s+\)

#include<bits/stdc++.h>
#define MAXN 50000
#define INF 100000
using namespace std;
int n;
struct node{
double x,y;
}a[MAXN];
double minx=INF,miny=INF,maxx=-INF,maxy=-INF;
double sx,sy;
bool cmp(node q,node w){
if(q.x==w.x) return q.y<w.y;
return q.x<w.x;
}
bool find(double x,double y){
for(register int i=n;i>=(n-1)/2-1;i--){ //这里的-1是因为c++是向下取整,多算一位
if(a[i].x==x&&a[i].y==y) return true;
}
return false;
}
bool check(){
for(register int i=1;i<=(n+1)/2+1;i++){ //这里的+1和上面的理由一样
double x=a[i].x,y=a[i].y;
if(find(2*sx-x,2*sy-y)==false) return false;
}
return true;
}
int main(){
scanf("%d",&n);
for(register int i=1;i<=n;i++){
scanf("%lf%lf",&a[i].x,&a[i].y);
minx=min(minx,a[i].x);
miny=min(miny,a[i].y);
maxx=max(maxx,a[i].x);
maxy=max(maxy,a[i].y);
}
sort(a+1,a+1+n,cmp);
sx=(double)(maxx+minx)*1.0/2;
sy=(double)(maxy+miny)*1.0/2;
if(check()==false){
puts("This is a dangerous situation!");
}else printf("V.I.P. should stay at (%.1f,%.1f).",sx,sy);
return 0;
}

P1227 【[JSOI2008]完美的对称】的更多相关文章

  1. 洛谷——P1227 [JSOI2008]完美的对称

    P1227 [JSOI2008]完美的对称 题目描述 在峰会期间,必须使用许多保镖保卫参加会议的各国代表.代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们.为了使他们的 ...

  2. 洛谷 P1227 [JSOI2008]完美的对称

    传送门 题目大意:求一些点集的公共对称中心 题解:对称中心是可以确定的,再判断. 代码: #include<iostream> #include<cstdio> #includ ...

  3. [JSOI2008]完美的对称 题解

    题目大意: 首先我们给定一点A以及对称中心S,点A'是点A以S为对称中心形成的像点,即点S是线段AA'的对称中心. 点阵组(X)以S为中心的像点是由每个点的像点组成的点阵组.X是用来产生对称中心S的, ...

  4. [JSOI2008] 完美的对称

    题目描述 在峰会期间,必须使用许多保镖保卫参加会议的各国代表.代表们除了由他自己的随身保镖保护外,组委会还指派了一些其他的特工和阻击手保护他们.为了使他们的工作卓有成效,使被保卫的人的安全尽可能得到保 ...

  5. [luoguP1227] [JSOI2008]完美的对称(sort)

    传送门 排序! #include <cstdio> #include <iostream> #include <algorithm> #define N 20001 ...

  6. 【省选水题集Day1】一起来AK水题吧! 题目(更新到B)

    题解:http://www.cnblogs.com/ljc20020730/p/6937954.html 水题A: [AHOI2001]质数和分解 题目网址: https://www.luogu.or ...

  7. 【省选水题集Day1】一起来AK水题吧! 题解(更新到B)

    题目:http://www.cnblogs.com/ljc20020730/p/6937936.html 水题A:[AHOI2001]质数和分解 安徽省选OI原题!简单Dp. 一看就是完全背包求方案数 ...

  8. Redis Sentinel中的机制与原理详解

    序言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案.实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署. 它的主要功能有以 ...

  9. Redis Sentinel实现的机制与原理详解

    序言 Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案.实际上这意味着你可以使用Sentinel模式创建一个可以不用人为干预而应对各种故障的Redis部署. 它的主要功能有以 ...

随机推荐

  1. java实现经典坦克大战及源代码下载

    坦克大战源码 (点击即可下载) 链接:https://pan.baidu.com/s/1m9aVheaquwxGKjYQrb72AA 提取码:j8dr see you ! 觉得有用的话点个赞再走

  2. PHP array_search() 函数

    实例 在数组中搜索键值 "red",并返回它的键名: <?php$a=array("a"=>"red","b" ...

  3. PHP curl_unescape函数

    (PHP 5 >= 5.5.0) curl_unescape — 解码经过URL编码的字符串. 说明 string curl_unescape ( resource $ch , string $ ...

  4. PHP preg_replace() 函数

    preg_replace 函数执行一个正则表达式的搜索和替换.高佣联盟 www.cgewang.com 语法 mixed preg_replace ( mixed $pattern , mixed $ ...

  5. luogu4443 coci 2017 Dajave

    题目 给出一个长度为2^M的排列,元素分别是0, 1, 2, ... , 2^M -1. 选择其中某个非空连续子序列,然后允许交换这个排列中某两个不同的数,然后使得这个连续子序列的所有数的按位异或(b ...

  6. xml schema杂谈

    有一些场景,我们需要写xml,又需要对内容进行约束,比如智能输入某个值范围,只能写入固定值 这个时候我们就需要xml schema 这个,百度解释为 XML Schema 的作用是定义 XML 文档的 ...

  7. AsyncTask被废弃了,换Coroutine吧

    本文主要是学习笔记,有版权问题还请告知删文 鸣谢:guolin@第一行代码(第三版) 你是否也在最近的代码中看见了 AsyncTask 被一条横杠划掉了 这表明--他要被Google放弃了 Googl ...

  8. 网络安全传输系统-sprint2线程池技术优化

    part1:线程池工作原理 为满足多客户端可同时登陆的要求,服务器端必须实现并发工作方式.当服务器主进程持续等待客户端连接时,每连接上一个客户端都需一个单独的进程或线程处理客户端的任务.但考虑到多进程 ...

  9. IDEA-Translation最优秀的翻译插件

    IDEA最优秀的翻译插件 效果 特性 多翻译引擎 Google翻译 有道翻译 百度翻译 多语言互译 文档翻译 语音朗读 自动选词 自动单词拆分 单词本 使用 申请有道智云翻译服务(可选): 注册有道智 ...

  10. Java实现短信验证码

    前言 本人使用的是阿里短信服务,一开始尝试了许多不同的第三方短信服务平台,比如秒滴科技.梦网云通讯.当初开始为什么会选择这两个,首先因为,他们注册就送10元钱(#^.^#),但是后来却发现他们都需要认 ...