对于给定的整数集合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进行排序(升序,用快排 ...
随机推荐
- [LeetCode] Array Partition I 数组分割之一
Given an array of 2n integers, your task is to group these integers into n pairs of integer, say (a1 ...
- Spring官方文档翻译(转)
http://blog.csdn.net/tangtong1/article/details/51326887 http://blog.csdn.net/tangtong1/article/detai ...
- [测试题]wows
Description 山山最近在玩一款游戏叫战舰世界(steam 游戏太少了),他被大舰巨炮的魅力折服,于是山山开了一局游戏,这次发现目标是一艘战列舰新墨西哥级,舰桥很高,原本应该打在目标身后的圆形 ...
- [HNOI2002]跳蚤
题目描述 Z城市居住着很多只跳蚤.在Z城市周六生活频道有一个娱乐节目.一只跳蚤将被请上一个高空钢丝的正中央.钢丝很长,可以看作是无限长.节目主持人会给该跳蚤发一张卡片.卡片上写有N+1个自然数.其中最 ...
- 素数密度_NOI导刊2011提高(04)
题目描述 给定区间[L, R](L <= R <= 2147483647,R-L <= 1000000),请计算区间中素数的个数. 输入 两个数 L 和 R. 输出 一行,区间中素数 ...
- POJ1222熄灯问题
千年老题,以前用枚举做,现在用高斯消元做 自由元直接做成0即可 #include<cstdio> #include<cstdlib> #include<algorithm ...
- ●POJ 1228 Grandpas Estate
题链: http://poj.org/problem?id=1228 题解: 计算几何,凸包 题意:给出一些点,求出其凸包,问是否是一个稳定的凸包. 稳定凸包:不能通过新加点使得原来凸包上的点(包括原 ...
- bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1159 Solved: 593[Submit] ...
- 实现PC视频播放最强画质教程( Potplayer播放器+MADVR插件)【转】
转自:http://www.hangge.com/blog/cache/detail_1461.html 一.MADVR介绍 MADVR 是一款超强的视频插件,其配合高清播放软件,可以做到目前 PC ...
- RAC基本原理
RAC基本原理 什么是RAC? 多个实例跑在多个服务器上 一个数据库存放在共享的存储上,所有实例都可以访问 实例之间通过内联网络交换数据和信息 共享存储内容:数据文件.REDO.UNDO.控制文件 参 ...