对于给定的整数集合S,求出最大的d,使得a+b+c=d。
对于给定的整数集合S,求出最大的d,使得a+b+c=d。a,b,c,d互不相同,且都属于S。集合的元素个数小于等于2000个,元素的取值范围在[-2^28,2^28 - 1],假定可用内存空间为100MB,硬盘使用空间无限大,试分析时间和空间复杂度,找出最快的解决方法。
提示:两两相加转为多项式乘法,比如(1 2 4 6) + (2 3 4 5) => (x + x^2 + x^4 + x^6)*(x^2 + x^3 + x^4 + x^5) 。
#include <iostream> #include<map> #include "bitmap.h" using namespace std; #define M (1024*1024*512) #define N 2000 multimap<int, int> mmp; void printBitmap(int n) { for (int i = 0; i < n; ++i) { if (test(i)) { cout << i << ' '; } } cout << endl; } void printMutimap() { multimap<int, int>::iterator i, iend; iend = mmp.end(); for (i = mmp.begin(); i != iend; i++) { cout << (*i).first << ' ' << (*i).second << endl; } } int* initRandom(int len, int range) { int* randoms = new int[len]; srand(unsigned(time(0))); for (int i = 0; i < len; i++) { randoms[i] = rand() % range; } return randoms; } void printArray(int* arr, int len) { cout << "数组:" << endl; for (int i = 0; i < len; ++i) { cout << arr[i] << ' '; } cout << endl; } /*求出集合中每2个数的和,并用bitmap存储, * multimap里边的key为2个数的和,value值为较小的数,则另一个值为key-value*/ void enumSum(int*arr, int len) { for (int i = 1; i < len; ++i) { if (arr[i - 1] != arr[i]) for (int j = i; j < len; ++j) { //arr[i - 1] != arr[j]和的2个数必须不同 if (arr[j - 1] != arr[j] && arr[i - 1] != arr[j]) { int sum = arr[i - 1] + arr[j]; // set(sum); mmp.insert(make_pair(sum, arr[i - 1])); } } } } int* enumSub(int* arr, int len) { typedef multimap<int, int>::size_type sz_type; for (int i = len - 1; i >= 0; --i) { for (int j = i - 1; j >= 0; --j) { if (arr[i] != arr[j]) { int sub = arr[i] - arr[j]; // if (test(sub)) { sz_type entries = mmp.count(sub); if (entries == 0) { continue; } else { multimap<int, int>::iterator iter = mmp.find(sub); for (sz_type cnt = 0; cnt != entries; ++cnt, ++iter) { if (iter->second == arr[i] || iter->second == arr[j]) { continue; } else if (iter->first - iter->second == arr[i] || iter->first - iter->second == arr[j]) { continue; } /*M区间[-2^28,2^28 - 1],所以正式结果必须减去(2^28-1)*/ int* result = new int[4]; result[0] = iter->first - iter->second; result[1] = iter->second; result[2] = arr[j]; result[3] = arr[i]; return result; } } // } } } } return NULL; } int main() { bitmap = new int[M / 32]; //M / 32 memset(bitmap, 0, M / 32 * sizeof(int)); //M * sizeof(int) int* arr = initRandom(N, M); sort(arr, arr + N); // printArray(arr, N); clock_t start_time = clock(); enumSum(arr, N); /*printBitmap(N); printMutimap(); */ // enumSub(arr, N); int* result = enumSub(arr, N); if (result) { cout << result[0] << '+' << result[1] << '+' << result[2] << '=' << result[3] << endl; } clock_t end_time = clock(); cout << "Running time is: " << static_cast<double>(end_time - start_time) / CLOCKS_PER_SEC * 1000 << "ms" << endl; //输出运行时间 return 0; }
对于给定的整数集合S,求出最大的d,使得a+b+c=d。的更多相关文章
- 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数。
描述 已知w是一个大于10但不大于1000000的无符号整数,若w是n(n≥2)位的整数,则求出w的后n-1位的数. 输入 第一行为M,表示测试数据组数.接下来M行,每行包含一个测试数据. 输出 ...
- 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。
给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...
- 作业帮:给定一个整数数组,找出其中两个数相加等于目标值(去重set)
题目描述 给定一个整数数组,找出其中两个数相加等于目标值 输入 [1,3,5,7,9,11] 10 输出 1,9 3,7 代码: import java.util.HashMap; import ja ...
- 给定一个整数N,找出一个比N大且最接近N,但二进制权值与该整数相同 的数
1,问题描述 给定一个整数N,该整数的二进制权值定义如下:将该整数N转化成二进制表示法,其中 1 的个数即为它的二进制权值. 比如:十进制数1717 的二进制表示为:0000 0110 1011 01 ...
- codevs:1462 素数和:给定2个整数a,b 求出它们之间(不含a,b)所有质数的和。
#include<iostream>#include<cstdio>#include<cmath>using namespace std;int main(){ i ...
- 编写一个应用程序,利用数组或者集合, 求出"HELLO",“JAVA”,“PROGRAM”,“EXCEPTION”四个字符串的平均长度以及字符出现重复次数最多的字符串。
public class Number { public static void main(String[] args) { String[] arr = { "HELLO", & ...
- 如何求出数组中最小(或者最大)的k个数(least k问题)
输入n个整数,如何求出其中最小的k个数? 解法1. 当然最直观的思路是将数组排序,然后就可以找出其中最小的k个数了,时间复杂度以快速排序为例,是O(nlogn): 解法2. 借助划分(Partitio ...
- C语言:找出一个大于给定整数m且紧随m的素数,-求出能整除x且不是偶数的数的个数,
//函数fun功能:找出一个大于给定整数m且紧随m的素数,并作为函数值返回. #include <stdlib.h> #include <conio.h> #include & ...
- 设计算法,求AB两个整数集合的交集
[本文链接] http://www.cnblogs.com/hellogiser/p/ab-set-intersection.html [分析] 思路1:排序法 对集合A和集合B进行排序(升序,用快排 ...
随机推荐
- kafka知识体系
最近一直在整理kafka相关资料,以构建自己的知识体系. 主要分为五大方面: Kafka设计与原理分析 Kafka配置分析 Kafka运维手册 Kafka编程开发 kafka源码分析
- 重拾Python(5):数据读取
本文主要对Python如何读取数据进行总结梳理,涵盖从文本文件,尤其是excel文件(用于离线数据探索分析),以及结构化数据库(以Mysql为例)中读取数据等内容. 约定: import numpy ...
- 用js来实现那些数据结构10(集合02-集合的操作)
前一篇文章我们一起实现了自定义的set集合类.那么这一篇我们来给set类增加一些操作方法.那么在开始之前,还是有必要解释一下集合的操作有哪些.便于我们更快速的理解代码. 1.并集:对于给定的两个集合, ...
- [HNOI 2014]道路堵塞
Description A国有N座城市,依次标为1到N.同时,在这N座城市间有M条单向道路,每条道路的长度是一个正整数.现在,A国 交通部指定了一条从城市1到城市N的路径,并且保证这条路径的长度是所有 ...
- [IOI 2011]ricehub
Description 乡间有一条笔直而长的路称为“米道”.沿着这条米道上 R 块稻田,每块稻田的坐标均为一个 1 到 L 之间(含 1 和 L)的整数.这些稻田按照坐标以不减的顺序给出,即对于 0 ...
- 【SYZOI Round1】滑稽的树
Description zzsyz实验楼里面种了一棵滑稽树,只有滑稽之力达到大乘期的oier才能看到.虽然我们看不到,但是还是知道一些信息: 这真的是一棵树,由n个节点,n-1条边联通.一号滑稽果同时 ...
- 用HTTP状态码实现提交表单后刷新页面不重复提交
正常情况下,表单提交后如果用户刷新页面会重复提交表单,有些情况下我们不希望表单重复提交,利用HTTP协议中的307状态码重定向页面可以实现这个目的.实例如下: 表单页面代码: <form act ...
- Fashion-MNIST:A MNIST-like fashion product database. Benchmark
Zalando的文章图像的一个数据集包括一个训练集6万个例子和一个10,000个例子的测试集. 每个示例是一个28x28灰度图像,与10个类别的标签相关联. 时尚MNIST旨在作为用于基准机器学习算法 ...
- Java获取随机数的3种方法
最小值---最大值(整数)的随机数 方法1 (数据类型)(最小值+Math.random()*(最大值-最小值+1)) 例: (int)(1+Math.random()*(10-1+1)) / ...
- Access restriction: The type VerticalTextSpinner is not accessible due to restriction on required library........
查了下竟然是编译器报错,orz了. Access restriction: 访问限制 on required library: 在依赖库(第三方包) 那就简单了,取消限制就好, eclipse的Win ...