http://acm.hdu.edu.cn/showproblem.php?pid=1407

计算方程x^2+y^2+z^2= num的一个正整数解。num为不大于10000的正整数

思路:

方法一、直接三重循环暴力 234MS

方法二、枚举x和y,对z进行二分查找。62MS

方法三、枚举x和y,对z用hash判断是否存在 15MS

方法二和方法三都是枚举x和y,但是二分查找为O(log(n))而hash为O(1)

可以看到,方法一和方法三差了十几倍!

还有就是用goto从内重循环直接跳出简洁而优雅。

方法一:直接三重循环暴力 234MS

#include<cstdio>
#include<cmath>
int res[101];
int main()
{
int n;
for(int i=1;i<=100;i++)
res[i]=i*i; while(~scanf("%d",&n))
{
for(int x=1;x<=100;x++)
for(int y=1;y<=100;y++)
for(int z=1;z<=100;z++)
if( res[x]+res[y]+res[z]==n)
{
printf("%d %d %d\n",x,y,z);
goto end;
}
end:;
}
return 0;
}

方法二:枚举x和y,对z进行二分查找。62MS

#include<cstdio>
#include<cmath>
int res[101];
int search(int n)
{
int L=1,R=101;
while(L<R)
{
int m=(L+R)>>1;
if(res[m]==n)
return m;
else if(res[m] < n)
L=m+1;
else
R=m;
}
return -1;
}
int main()
{
int n;
for(int i=1;i<=100;i++)
res[i]=i*i; while(~scanf("%d",&n))
{
for(int x=1;x<=100;x++)
{
for(int y=1;res[x]+res[y]<n;y++)
{
int z=search(n-res[x]-res[y]);
if(z!=-1)
{
printf("%d %d %d\n",x,y,z);
goto end; }
}
} end:;
}
return 0;
}

方法三:枚举x和y,对z用hash判断是否存在  15MS

#include<cstdio>
#include<cmath>
const int MAXN=10001;
int res[101];
struct HASH
{
bool exist;
int index;
}hash[MAXN];
int main()
{
int n;
for(int i=1;i<=100;i++)
{
res[i]=i*i;
hash[ res[i] ].exist=true;
hash[ res[i] ].index=i;
} while(~scanf("%d",&n))
{
for(int x=1;x<=100;x++)
{
for(int y=1;res[x]+res[y]<n;y++)
{
int id=n-res[x]-res[y];
if(hash[id].exist)
{
printf("%d %d %d\n",x,y,hash[id].index);
goto end; }
}
} end:;
}
return 0;
}

HDU 1407 测试你是否和LTC水平一样高 枚举、二分、hash的更多相关文章

  1. HDU 1407 测试你是否和LTC水平一样高(枚举)

    测试你是否和LTC水平一样高 Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z ...

  2. B题 hdu 1407 测试你是否和LTC水平一样高

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1407 测试你是否和LTC水平一样高 Time Limit: 2000/1000 MS (Java/Ot ...

  3. 解题报告:hdu 1407 测试你是否和LTC水平一样高

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1407 Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目 ...

  4. hdu 1407 测试你是否和LTC水平一样高

    Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解.  Inpu ...

  5. HDOJ(HDU) 1407 测试你是否和LTC水平一样高(暴力)

    Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数 ...

  6. 测试你是否和LTC水平一样高[HDU1407]

    测试你是否和LTC水平一样高Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...

  7. 测试你是否和LTC水平一样高

    Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z^2= num的一个正整数解. ...

  8. HDU1407 测试你是否和LTC水平一样高

    题目大意:给出一个num,计算方程x^2+y^2+z^2 = num的第一个正整数解(字典序),0 < num <= 10000. 方法参考了网上的博客,自己打了一波,发现还有很多不懂的地 ...

  9. HDU - 1407 打表

    思路:预处理10000以内所有数的三平方和即可. AC代码 #include <cstdio> #include <cmath> #include <algorithm& ...

随机推荐

  1. netty实现TCP长连接

    所用jar包 netty-all-4.1.30.Final.jar 密码:rzwe NettyConfig.java,存放连接的客户端 import io.netty.channel.group.Ch ...

  2. fc---输出历史命令列表

    fc指令 fc指令可以用于输出历史命令列表,也可以通过调用vi编辑器对历史指令内容进行编辑输出. 语法: fc [-e ename] [-lnr] [first] [last] 选项: -l:显示历史 ...

  3. groups---输出指定用户所在组的组成员,

    groups命令   groups命令在标准输入输出上输出指定用户所在组的组成员,每个用户属于/etc/passwd中指定的一个组和在/etc/group中指定的其他组. 语法 groups(选项)( ...

  4. 【Pycharm】【HTML/jQuery】代码换行问题

    问题:从网上下载jQuery文件后发现代码太长,不利于阅读:Pycharm没有预先设置好js文件的自动换行设置 问题 解决办法 解决后

  5. [NOI.AC#40]Erlang

    链接 题解 显然,最多抽2个集合 如果一直抽一个,前提是该集合有重复的,答案是不同元素的个数+1 如果抽两个,那么最坏情况下,在一个集合中抽到某一个数的次数是这个集合不同元素的个数(因为抽不到重复的) ...

  6. Flume的可管理性

    Flume的可管理性  所有agent和Collector由master统一管理,这使得系统便于维护. 多master情况,Flume利用 ZooKeeper和gossip,保证动态配置数据的一致性. ...

  7. JVM 基础知识(GC)

    几年前写过一篇关于JVM调优的文章,前段时间拿出来看了看,又添加了一些东西.突然发现,基础真的很重要.学习的过程是一个由表及里,再由里及表的过程,所谓的"温故而知新".而真正能走完 ...

  8. BZOJ3672: [Noi2014]购票(CDQ分治,点分治)

    Description  今年夏天,NOI在SZ市迎来了她30周岁的生日.来自全国 n 个城市的OIer们都会从各地出发,到SZ市参加这次盛会.        全国的城市构成了一棵以SZ市为根的有根树 ...

  9. 洛谷 P1795 无穷的序列_NOI导刊2010提高(05)

    P1795 无穷的序列_NOI导刊2010提高(05) 题目描述 有一个无穷序列如下: 110100100010000100000… 请你找出这个无穷序列中指定位置上的数字 输入输出格式 输入格式: ...

  10. 一种较为隐蔽ConcurrentModificationException情形

    ConcurrentModificationException是遍历过程中修改list而抛出的错误.就像前面分析的,单线程时这种错误主要是因为使用forEach造成:遍历一个拷贝,修改原始list,造 ...