HDU 1407 测试你是否和LTC水平一样高 枚举、二分、hash
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的更多相关文章
- HDU 1407 测试你是否和LTC水平一样高(枚举)
测试你是否和LTC水平一样高 Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z ...
- B题 hdu 1407 测试你是否和LTC水平一样高
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1407 测试你是否和LTC水平一样高 Time Limit: 2000/1000 MS (Java/Ot ...
- 解题报告:hdu 1407 测试你是否和LTC水平一样高
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1407 Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目 ...
- hdu 1407 测试你是否和LTC水平一样高
Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数解. Inpu ...
- HDOJ(HDU) 1407 测试你是否和LTC水平一样高(暴力)
Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上! 你的任务是: 计算方程x^2+y^2+z^2= num的一个正整数 ...
- 测试你是否和LTC水平一样高[HDU1407]
测试你是否和LTC水平一样高Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- 测试你是否和LTC水平一样高
Problem Description 大家提到LTC都佩服的不行,不过,如果竞赛只有这一个题目,我敢保证你和他绝对在一个水平线上!你的任务是:计算方程x^2+y^2+z^2= num的一个正整数解. ...
- HDU1407 测试你是否和LTC水平一样高
题目大意:给出一个num,计算方程x^2+y^2+z^2 = num的第一个正整数解(字典序),0 < num <= 10000. 方法参考了网上的博客,自己打了一波,发现还有很多不懂的地 ...
- HDU - 1407 打表
思路:预处理10000以内所有数的三平方和即可. AC代码 #include <cstdio> #include <cmath> #include <algorithm& ...
随机推荐
- 【基础篇】点击Button按钮更换图片
我们在开发的过程中,往往为了美化界面的需要,会修改按钮的默认外观,而因为Android中的按钮有三种状态—默认,被点击,被选中.所以,如果要改变按钮的外观,需要对这三种情况都做出修改,也许在以往,我们 ...
- Log4Net 用法记录
https://www.cnblogs.com/lzrabbit/archive/2012/03/23/2413180.html https://blog.csdn.net/guyswj/articl ...
- 微信小程序从零开始开发步骤(一)搭建开发环境
从零到有写一个小程序系列专题,很早以前就想写来分享,但由于项目一直在进展,没有过多的时间研究技术,现在可以继续分享了. 1:注册 用没有注册过微信公众平台的邮箱注册一个微信公众号, 申请帐号 ,网址: ...
- The program yum-complete-transaction is found in the yum-utils package
用yum安装的时候出现 The program yum-complete-transaction is found in the yum-utils package. 错误提示的解决方法:# 安装 y ...
- css 兼容性前缀
一.不同浏览器内核下的书写规则 二:transform 具体变性中心基点 transform-origin 默认情况下 rotate旋转.scale缩放.translate位移.矩阵matri ...
- 1.22 Python基础知识 - 正则表达式
Python正则表达式 正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配. Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式. re ...
- JavaScript学习总结(3)——JavaScript函数(function)
一.函数基本概念 为完成某一功能的程序指令(语句)的集合,称为函数. 二.JavaScript函数的分类 1.自定义函数(我们自己编写的函数),如:function funName(){} 2.系统函 ...
- 洛谷——P1073 最优贸易 ([NOIP2009] )
https://www.luogu.org/problem/show?pid=1073 题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多 ...
- matlab 辅助函数 —— 文件下载与文件解压
0. 可读性的提升 为了提升代码的交互友好性,可在代码执行一些耗时操作时,显示地输出一些文本信息,以显示进度: fprintf('Downloading xxfilename...\n') urlwr ...
- HTML基础第五讲---控制表格及其表项的对齐方式
转自:https://i.cnblogs.com/posts?categoryid=1121494 缺省情况下,表格在浏览器屏幕上左对齐,你可以使用<TABLE>的ALIGN属性来指定表格 ...