1331:求a在200以内满足a的立方等于b,c,d立方和的所有解。按a升序列出。
对于相同的a可能有符合的多种组合,要求按升序列出。
思路是多重循环遍历求解。
第一次写得代码如下:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<memory.h>
#include<math.h>
#include<vector>
#include<algorithm>
using namespace std;
struct Cube
{
int a;
int b;
int c;
int d;
};
bool myorder(const Cube& s1,const Cube& s2)
{
if(s1.a != s2.a)
return s1.a < s2.a;
else if(s1.b != s2.b)
return s1.b < s2.b;
else
return s1.c < s2.c;
}
int a[201];
int b[201];
int c[201];
int d[201];
int cube[201];
vector<Cube> vcube;
int main()
{
double res;
int index;
int sum;
int vceil;
int vfloor;
//初始计算
for(int i=0;i<=200;i++)
cube[i]=i*i*i;
for(int bb=2;bb<=200;bb++)
for(int cc=bb;cc<=200;cc++)
for(int dd=cc;dd<=200;dd++)
{
sum=cube[bb]+cube[cc]+cube[dd];
res=pow(sum,1.0/3);
vceil = ceil(res);
vfloor = floor(res);
if(cube[vceil]==sum)
index=vceil;
else if(cube[vfloor]==sum)
index=vfloor;
else
index=-1;
if(index!=-1)
{
Cube c;
c.a=index;
c.b=bb;
c.c=cc;
c.d=dd;
vcube.push_back(c);
sort(vcube.begin(),vcube.end(),myorder);
}
}
for(int i=0;i<vcube.size();i++)
{
printf("Cube = %d, Triple = (%d,%d,%d)\n",vcube[i].a,vcube[i].b,vcube[i].c,vcube[i].d);
}
}
由于采用先得b,c,d再求a的方法,遇到了开方问题和排序问题。对于开方由于精度问题,原本的等式也可能不等。采用floor和ceil取整尝试。循环后自定义了排序方式进行排序。代码比较臃肿,运行效率低。
看到了一个好的写法如下
#include <stdio.h>
int BinarySearch(int s[], int high, int low, int key)
{
int mid;
while (low <= high) {
mid = (high + low) / 2;
if (s[mid] == key) return mid;
else if (s[mid] < key) low = mid + 1;
else high = mid - 1;
}
return 0;
}
int main(int argc, char *argv)
{
int a, b, c, d, i, cube[201];
for (i = 1; i < 201; i ++) cube[i] = i * i * i;
for (a = 6; a <= 200; a ++)
for (b = 2; b < a; b ++) {
i = cube[a] - cube[b];
for (c = b + 1; c < a; c ++) {
d = BinarySearch(cube, a - 1, c + 1, i - cube[c]);
if (d) printf("Cube = %d, Triple = (%d,%d,%d)\n", a, b, c, d);
}
}
return 0;
}
代码比较精简。两份代码都是采用了数组先将200以内所有数的立方值预先算好,由于需要多次使用,这样避免了重复计算。
主要的不同体现在循环的顺序以及验证等式的方法。采用已知a,b,c求d的方式。这样的好处是把a,b,c放在循环条件中,保持了升序。验证相等时没有采用开方,而是用了二分搜索,避免了浮点数处理。
在边界的处理上也体现了效率。如循环的上下界,搜索的上下界,这些都提升了效率。
分享到:
相关推荐
- [Zhejiang University Online Judge (ZOJ)](http://acm.zju.edu.cn/onlinejudge/) 以上书籍和学习路径为想要深入学习算法的同学提供了丰富的资源,通过系统性地学习这些经典书籍,可以显著提升算法理解和应用的...
ZOJ (Zhejiang University Online Judge) - **特点**:浙江大学主办的在线编程平台。 - **适用对象**:ACM竞赛选手。 - **优势**:与高校合作紧密,实战经验丰富。 ### 17. CodeChef - **特点**:印度的一家在线...
1. **Strange Country II (ZOJ-3332) 竞赛图** - **题目描述**:在一种特殊的图——竞赛图中寻找哈密顿回路。 - **解题思路**:竞赛图中每个节点的入度和出度都为1,因此可以按照顺序构造哈密顿回路。 - **数据...
- **ZOJ 1610** 和 **POJ 2777**:这两道题都是典型的线段覆盖问题,需要利用线段树来解决。基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被...
Interview,ZOJ,POJ 等平台。 欢迎Coders对代码加以指正和提议! 常见问题总结 两整数求平均值 average = min + (max - min) / 2 防止两整数的和越界 整数乘积对比 1.0 * m * m == num 类似乘积对比, 需转为double...
- 解决ZOJ等网站上的难题 - 参加各类在线比赛,体验比赛氛围 - 对已解决的题目进行深入分析,探索更优解法 通过以上训练计划,可以在短时间内迅速提高算法和编程能力,更好地应对各种类型的ACM竞赛。
### ACM新手训练方案知识点详解 #### 一、基础算法与数据结构 在ACM竞赛中,基础算法与数据结构是入门必备的知识点。本部分主要介绍了一些基础算法及其应用场景。 ##### 1....- **排序**:如快速排序、归并排序等。...
- **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...
- 经常参与ZOJ等在线评测系统的练习。 - 参加校内或线上的模拟赛。 - 注重团队协作能力的培养。 - 养成良好的编程习惯和调试能力。 #### 四、常见算法与数据结构详解 - **图论**: - 最短路径算法(Floyd、...
#### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...
- **浙江大学在线评测系统(ZOJ)**:这是一个常用的在线评测平台,提供了丰富的题目资源和即时反馈机制。 - **提交代码**:介绍如何在ZOJ平台上注册账户、提交代码以及查看评测结果的过程。 #### 3. C++ STL泛型...
- **平台**: 例如浙江大学在线评测系统 (ZOJ)。 - **功能**: 在线提交代码、获取即时反馈。 - **流程**: - 注册账号并登录。 - 查看题目描述和要求。 - 编写并提交代码。 - 获取评测结果,根据结果调整代码直至...
- **特点**: POJ相较于ZOJ建立时间稍晚,但题目更新迅速,数量已接近或超过了ZOJ。POJ的特点在于举办在线比赛的频率较高,这对于参赛者来说是一个很好的实战机会。与ZOJ相比,POJ的数据难度略低,但这并不意味着其...
【标题】"ZOJ-CPP.zip" 是一个包含ZOJ(在线判题系统ZeroJudge)网站上多个C++编程练习解答的压缩包。这个压缩包的名称表明它专注于C++语言,很可能是一个学习资源,旨在帮助初学者理解和解决动态规划问题。 【描述...
### ZOJ全部题目分类详解 #### 一、概述 ZOJ(Zhejiang Online Judge)作为一项在线编程竞赛平台,提供了丰富的算法题目供学习者练习。本文将根据所提供的文件中的“初学者题”、“模拟问题”、“动态规划”及...