`
linest
  • 浏览: 155578 次
  • 性别: Icon_minigender_1
  • 来自: 内蒙古
社区版块
存档分类
最新评论

ZOJ-1331* a3=b3+c3+d3

    博客分类:
  • acm
 
阅读更多
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放在循环条件中,保持了升序。验证相等时没有采用开方,而是用了二分搜索,避免了浮点数处理。

在边界的处理上也体现了效率。如循环的上下界,搜索的上下界,这些都提升了效率。
分享到:
评论

相关推荐

    ACM算法经典书籍----最全最详细的书籍推荐!

    - [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**:这两道题都是典型的线段覆盖问题,需要利用线段树来解决。基本思路是通过线段树维护每个区间是否被覆盖的状态。对于每个覆盖请求,更新线段树对应区间中的覆盖状态,并统计完全被...

    leetcode下载-algorithm-1:力扣、HDU、ZOJ、POJ

    Interview,ZOJ,POJ 等平台。 欢迎Coders对代码加以指正和提议! 常见问题总结 两整数求平均值 average = min + (max - min) / 2 防止两整数的和越界 整数乘积对比 1.0 * m * m == num 类似乘积对比, 需转为double...

    ACM练习题库

    - 解决ZOJ等网站上的难题 - 参加各类在线比赛,体验比赛氛围 - 对已解决的题目进行深入分析,探索更优解法 通过以上训练计划,可以在短时间内迅速提高算法和编程能力,更好地应对各种类型的ACM竞赛。

    acm新手训练方案新手必备

    ### ACM新手训练方案知识点详解 #### 一、基础算法与数据结构 在ACM竞赛中,基础算法与数据结构是入门必备的知识点。本部分主要介绍了一些基础算法及其应用场景。 ##### 1....- **排序**:如快速排序、归并排序等。...

    Acm竞赛常用算法与数据结构

    - **浙江大学微软技术俱乐部**和**ZOJ**(在线评测系统)是训练和选拔优秀选手的重要平台。 - **参考书籍**:《C++ Primer》、《C++标准程序库》、《算法导论》、《算法艺术与信息学竞赛》等是深入学习的基础资料...

    acm 资料大全 程序 设计 竞赛 icpc

    - 经常参与ZOJ等在线评测系统的练习。 - 参加校内或线上的模拟赛。 - 注重团队协作能力的培养。 - 养成良好的编程习惯和调试能力。 #### 四、常见算法与数据结构详解 - **图论**: - 最短路径算法(Floyd、...

    OnlineJudge站点网址

    #### 2.2 Zhejiang University ACM Online Judge (ZOJ) - **网址**: http://acm.zju.edu.cn - **特点**: - 由浙江大学维护,题目难度适中,适合练习ACM竞赛题目。 - 界面简洁,易于上手。 #### 2.3 Sichuan ...

    acm程序设计曾宗根

    - **浙江大学在线评测系统(ZOJ)**:这是一个常用的在线评测平台,提供了丰富的题目资源和即时反馈机制。 - **提交代码**:介绍如何在ZOJ平台上注册账户、提交代码以及查看评测结果的过程。 #### 3. C++ STL泛型...

    国际大学生程序设计竞赛指南—ACM程序设计

    - **平台**: 例如浙江大学在线评测系统 (ZOJ)。 - **功能**: 在线提交代码、获取即时反馈。 - **流程**: - 注册账号并登录。 - 查看题目描述和要求。 - 编写并提交代码。 - 获取评测结果,根据结果调整代码直至...

    在线online judge

    - **特点**: POJ相较于ZOJ建立时间稍晚,但题目更新迅速,数量已接近或超过了ZOJ。POJ的特点在于举办在线比赛的频率较高,这对于参赛者来说是一个很好的实战机会。与ZOJ相比,POJ的数据难度略低,但这并不意味着其...

    zoj-cpp.zip_zoj

    【标题】"ZOJ-CPP.zip" 是一个包含ZOJ(在线判题系统ZeroJudge)网站上多个C++编程练习解答的压缩包。这个压缩包的名称表明它专注于C++语言,很可能是一个学习资源,旨在帮助初学者理解和解决动态规划问题。 【描述...

    ZOJ全部题目分类(分得很细哦)

    ### ZOJ全部题目分类详解 #### 一、概述 ZOJ(Zhejiang Online Judge)作为一项在线编程竞赛平台,提供了丰富的算法题目供学习者练习。本文将根据所提供的文件中的“初学者题”、“模拟问题”、“动态规划”及...

Global site tag (gtag.js) - Google Analytics