这题卡了一天,上午开始看算法导论,然后实现了,一开始是wa,后来TLE,由于我开始的实现方式比较笨,而且在递归调用的时候很是混乱,用了好多数组。导致我的代码不断的出问题。具体是算法导论33-4.

后来改动了一点,也是看到别人代码改的,我把两个代码都写上,大家一看便知!

在实现分治的时候,我是把左右两个分组都复制了,然后传递的是一个数组,好慢啊。。。改动就是把参数传递改成传的是地址了,这样就不用复制结构体数组啦,不知道节省了多少力气,(⊙o⊙)…

首先是AC代码

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#define eps 0.000000001
#define S(x) (x)*(x)
#define aabs(x) (x)>0?(x):-(x)
using namespace std;
struct point{
double x,y;
};
bool cmp(point a,point b){
if( a.x==b.x) return a.y>b.y;
return a.x<b.x;
}
bool cmpy(point a,point b){
return (a.y>b.y);
}
struct point P[+];
struct point SCL[+];
double find(int l,int r){
int i,j,k,sn,mid=(l+r)/;
double res=,lres,lx,rx,rres,tmp;
if(r-l+<=){
for(i=l;i<=r;++i){
for(j=i+;j<=r;++j){
tmp=sqrt( S(P[i].x-P[j].x) + S(P[i].y-P[j].y) );
if(res-tmp>eps) res=tmp;
}
}
return res;
}
lres=find(l,mid); rres=find(mid+,r);
res=min(lres,rres);
lx=P[mid].x-res; rx=P[mid].x+res;
sn=;
for(i=l;i<=r;++i){
if(P[i].x-lx>eps && eps<rx-P[i].x){
SCL[sn].x=P[i].x; SCL[sn].y=P[i].y; sn++;
// printf("~~~~~~%lf,%lf\n",P[i].x,P[i].y);
}
}
sort(SCL,SCL+sn,cmpy);
for(i=;i<sn;++i){
for(j=i+;j<sn;++j){
if(SCL[i].y-SCL[j].y>res) break;
if(res- sqrt( S(SCL[j].x-SCL[i].x) + S(SCL[j].y-SCL[i].y) ) > eps)
res = sqrt( S(SCL[j].x-SCL[i].x) + S(SCL[j].y-SCL[i].y) );
}
}
return res;
} int main(){
int n;
int i,j;
while(~scanf("%d",&n)&&n){
for(i=;i<n;++i){
scanf("%lf%lf",&P[i].x,&P[i].y);
}
sort(P,P+n,cmp);
printf("%.2lf\n",find(,n-)/);
}
return ;
}

  然后是TLE代码!

!!!!!!!!!!!!

 #include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <string.h>
#define eps 0.000000001
#define S(x) (x)*(x)
#define aabs(x) (x)>0?(x):-(x)
using namespace std;
struct point{
double x,y;
};
bool cmp(point a,point b){
if( aabs(a.x-b.x) < eps) return (b.y-a.y)>eps;
return (b.x-a.x)>eps;
}
bool cmpy(point a,point b){
return (a.y>b.y);
}
struct point L[+],R[+];
struct point SCL[+];
double find(int n, struct point P[]){
int i,j,k,ln=,rn=,sn,mid=n/;
double res=,lx,rx,lres,rres,tmp;
// for(i=0;i<n;++i) printf("%lf %lf \n",P[i].x,P[i].y);
// printf("\n");
if(n<=){
for(i=;i<n;++i){
for(j=i+;j<n;++j){
tmp=sqrt( S(P[i].x-P[j].x) + S(P[i].y-P[j].y) );
if(res-tmp>eps) res=tmp;
}
}
return res;
}
for(i=;i<n;++i){ //init the L , R
if(i<mid){
L[ln].x=P[i].x; L[ln].y=P[i].y; ln++;
}else{
R[rn].x=P[i].x; R[rn].y=P[i].y; rn++;
}
}
lres=find(ln,L); rres=find(rn,R);
res=min(lres,rres);
lx=P[mid].x-res; rx=P[mid].x+res;
sn=;
for(i=;i<n;++i){
if(P[i].x-lx>eps && eps<rx-P[i].x){
SCL[sn].x=P[i].x; SCL[sn].y=P[i].y; sn++;
// printf("~~~~~~%lf,%lf\n",P[i].x,P[i].y);
}
}
sort(SCL,SCL+sn,cmpy);
for(i=;i<sn;++i){
for(j=i+;j<sn;++j){
if(SCL[i].y-SCL[j].y>res) break;
if(res- sqrt( S(SCL[j].x-SCL[i].x) + S(SCL[j].y-SCL[i].y) ) > eps)
res = sqrt( S(SCL[j].x-SCL[i].x) + S(SCL[j].y-SCL[i].y) );
}
}
return res;
} int main(){
int n;
int i,j;
point INIT[+];
while(~scanf("%d",&n)&&n){
for(i=;i<n;++i){
scanf("%lf%lf",&INIT[i].x,&INIT[i].y);
}
sort(INIT,INIT+n,cmp);
printf("%.2lf\n",find(n,INIT)/);
}
return ;
}

HDU1007 TLE代码和AC代码对比的更多相关文章

  1. HDU2449 Gauss Elimination 高斯消元 高精度 (C++ AC代码)

    原文链接https://www.cnblogs.com/zhouzhendong/p/HDU2449.html 题目传送门 - HDU2449 题意 高精度高斯消元. 输入 $n$ 个 $n$ 元方程 ...

  2. python爬虫学习(7) —— 爬取你的AC代码

    上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...

  3. ZOJ Problem Set - 1338 Up and Down Sequences 解释 ac代码

    这道题目我一开始一头雾水,怎么都数不对,参考了下网上的博文,才弄懂. 题意是这样的,如果是上升序列,上升序列的长度不是所有上升数字的,是这么规定的,如果它与前一个数字构成上升,那么这个数字算上长度.所 ...

  4. ZOJ Problem Set - 1334 Basically Speaking ac代码及总结

    这道题目不难,是一道简单的进制转换问题,但是发现了自己两个遗漏的知识点: 1.关于scanf (1)scanf函数在输入时是以回车或者空格作为一次输入的结束 (2)scanf函数在输入字符串的过程中是 ...

  5. LeetCode OJ Symmetric Tree 判断是否为对称树(AC代码)

      思路: 主要判断左子树与右子树. 在判断左时,循环下去肯定会到达叶子结点中最左边的结点与最右边的结点比较. 到了这一步因为他们都没有左(右)子树了,所以得开始判断这两个结点的右(左)子树了. 当某 ...

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

    小技巧:本文之前由csdn自动生成了一个目录,不必下拉一个一个去找,可通过目录标题直接定位. 本文转载自本人的csdn博客,复制过来的,排版就不弄了,欢迎转载. 声明: 题目部分皆为南阳OJ题目. 代 ...

  7. 【原创】用Python爬取LeetCode的AC代码到Github

    在leetCode写了105道题高调膜科,考虑搬迁到自己的GitHub上,做成一个解题题库,面试的时候也可以秀一个 但是!但是! leetCode在线IDE的功能不要太舒服,我直接线上A了不少题,本地 ...

  8. 洛谷P4014 分配问题【最小/大费用流】题解+AC代码

    洛谷P4014 分配问题[最小/大费用流]题解+AC代码 题目描述 有 n 件工作要分配给 n 个人做.第 i 个人做第 j 件工作产生的效益为c ij. 试设计一个将 n 件工作分配给 n 个人做的 ...

  9. 洛谷 P4016负载平衡问题【费用流】题解+AC代码

    洛谷 P4016负载平衡问题 P4014 分配问题[费用流]题解+AC代码 负载平衡问题 题目描述 GG 公司有n个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n ...

随机推荐

  1. 用好js与nodejs中的try...catch

    对异常的捕获和处理是提高程序鲁棒性的一个重要方式,即使在javascript/nodejs等看似“很难写出bug”的弱类型语言里,异常捕获处理仍至关重要,这主要是因为: 1.在一个代码块里,如果程序运 ...

  2. 从零开始利用vue-cli搭建简单音乐网站(四)

    上一篇文章中说到这一篇博客会实现音乐播放功能,只是令我意外的是,如果利用h5的audio标签,几行代码就实现了......先来看一下最终效果吧. 这里直接用了audio标签,样式没有怎么管,能获得音乐 ...

  3. Oracle数据仓库创建教程

    Oracle数据仓库创建教程.如何创建一个数据仓库,创建实例,以为毕业设计要求,最近开始Oracle的数仓建模实践,详细记录了图形界面下的 Oracle database 12C 数据仓库创建过程. ...

  4. UVA 11324 The Largest Clique (强连通分量,dp)

    给出一个有向图,求一个最大的结点集合,任意两个点u,v.u可到达v或v可到达u. 一个强连通分量肯定一起选的.而且只能在一条路径上. 所以先找出所有scc,然后缩点找一条最大权的路径,按拓扑序跑DAG ...

  5. "Mac OS X"录屏幕视频并转成gif

    第一步: 使用软件QuickTime Player录屏幕视频,创建方式选择新建屏幕录制: 选择区域录制,录好保存后,就需要转gif,需要另外一个软件. 第二步: 使用GIFBrewery软件创建gif ...

  6. sql视图和表的区别

    整理一下视图和表的区别 区别: 1.视图是已经编译好了的sql,表不是 2.视图没有实际的物理存储记录,表有 3.视图是逻辑概念,表可以进行修改 5.表是内模式,视图是外模式 6.视图是我们查看表的方 ...

  7. Asp.Net Core 进阶(二) —— 集成Log4net

    Asp.Net Core 支持适用于各种内置日志记录API,同时也支持其他第三方日志记录.在我们新建项目后,在Program 文件入口调用了CreateDefaultBuilder,该操作默认将添加以 ...

  8. BCB:AnsiString和String的区别

    AnsiString和String的区别.使用 本文转自:http://www.bianceng.cn/c/index.htm 16.C/C++语言在CB中的一些特定用法 2)AnsiString是从 ...

  9. archlinux alsa安装,音量设置和音量信息保存

    1,使用前确认安装了alsa-utils sudo pacman -S alsa-utils2,运行alsamixer调试音量 alsamixer左右键选择调哪个,将Master和PCM按“m”解除静 ...

  10. 分享一个Delphi跨平台Http库的封装,一个Delphi跨平台TCP库的封装

    { 单元名:跨平台的TCP客户端库封装 作者:5bug 网站:http://www.5bug.wang } unit uCPTcpClient; interface uses System.Class ...