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& ...
随机推荐
- date---显示或设置系统时间与日期
date命令可以用来显示或设定系统的日期与时间,格式设定为一个加号后接数个标记,其中可用的标记列表如下: 时间方面: %H : 小时(00..23) %M : 分钟(00..59) %p : 显示本地 ...
- badblocks 检查硬盘是否有坏道
硬盘是比較easy坏掉的设备,使用一段时间后可能会出现坏道等物理故障. 当硬盘出现坏道后,若不及时更换或者进行技术上的处理,磁盘的坏道就会越来越多,并会造成频繁死机和数据丢失. 最好的处理方法是更换新 ...
- JavaScript的子集和超集
1.JavaScript子集 JavaScript子集的定义大部分都是出于安全考虑,仅仅有使用这门语言的一个安全的子集编写脚本,才干让代码运行得更安全.更稳定.比方怎样更安全地运行一段由不可信第三方提 ...
- js05---js实现Map
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...
- 洛谷P3613 睡觉困难综合征(LCT)
题目: P3613 睡觉困难综合症 解题思路: LCT,主要是维护链上的多位贪心答案,推个公式:分类讨论入0/1的情况,合并就好了(公式是合并用的) 代码(我不知道之前那个为啥一直wa,改成结构体就好 ...
- CSRF Failed: Referer checking failed - no Referer
postman模拟登录出了这个错误,其实看标题就知道大概是怎么回事,网上大概找了办法,也没说到位,所以干脆自己找源码了. 问题很明显就是出在 CSRF 上,理所当然去查看 CsrfViewMiddle ...
- 洛谷——P1012 拼数
https://www.luogu.org/problem/show?pid=1012#sub 题目描述 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 例如:n=3时,3个整 ...
- Codeforces Round #277.5 解题报告
又熬夜刷了cf,今天比正常多一题.比赛还没完但我知道F过不了了,一个半小时贡献给F还是没过--应该也没人Hack.写写解题报告吧= =. 解题报告例如以下: A题:选择排序直接搞,由于不要求最优交换次 ...
- 玩转Bootstrap(基础) -- (6.导航条基础)
1.导航条样例 <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" ...
- setting.system-全局属性的设定
SystemProperties跟Settings.System 1 使用 SystemProperties.get如果属性名称以“ro.”开头,那么这个属性被视为只读属性.一旦设置,属性值不能改变. ...