uva_10125_Sumsets( 二分 )
来源:互联网 发布:unity3d 4.5破解版 编辑:程序博客网 时间:2024/06/06 00:40
題意:
給你一個整數集合,要求你從中找出一個最大的d,使得a+b+c=d,其中a,b,c,d都是集合s中的不同元素
分析:
如果暴力的話O(N^4),但是可以使用二分解決,就是美劇a+b後對其結果排序,接着枚舉d-c如果二分查找a+b的結果中存在a+b = d-c,那麼這個d就是一個解
時間複雜度O(N^2*log(N*N))
Code:
#include <set>#include <map>#include <cmath>#include <ctime>#include <stack>#include <queue>#include <deque>#include <vector>#include <cstdio>#include <bitset>#include <cstdlib>#include <cstring>#include <algorithm>using namespace std;#define DIR 4#define DIM 2#define STATUS 2#define MAXN 1000000 + 10#define oo (~0u)>>1#define INF 0x3F3F3F3F#define REPI(i, s, e) for(int i = s; i <= e; i ++)#define REPD(i, e, s) for(int i = e; i >= s; i --)static const double EPS = 1e-5;typedef struct Node_ { long long sum, each;}Node;Node s[MAXN];long long val[MAXN], arr[MAXN];void input(int n){ REPI(i, 1, n) { scanf("%lld", &val[i]); }}int valid(long long a, long long b, long long c, long long d){ if( a == b || a == c || a == d ) { return 0; } if( b == c || b == d || c == d ) { return 0; } return 1;}inline int cmp(const Node &a, const Node &b){ return a.sum < b.sum;}long long process(int n){ int idx = 0; REPI(i, 1, n) { REPI(j, i+1, n) { if( val[i] == val[j] ) { continue; } s[idx].each = val[i]; s[idx ++].sum = val[i]+val[j]; } } sort(s, s+idx, cmp); REPI(i, 0, idx-1) { arr[i] = s[i].sum; } long long rst = -INF; REPI(i, 1, n) { REPI(j, 1, n) { long long max_one = val[i], min_one = val[j]; if( max_one < min_one ) { swap(max_one, min_one); } else if( max_one == min_one ) { continue; } int m = lower_bound(arr, arr+idx, max_one-min_one)-arr; if( arr[m] != max_one-min_one ) { continue; } if( !valid(max_one, min_one, s[m].each, s[m].sum-s[m].each) ) { continue; } rst = max(rst, val[i]); } } return rst;}void ouput(long long rst){ if( -INF == rst ) { printf("no solution\n"); return; } printf("%lld\n", rst);}int main(int argc, char const *argv[]){#ifndef ONLINE_JUDGE freopen("test.in", "r", stdin);#endif int n; while( scanf("%d", &n) && n ) { input(n); ouput(process(n)); } return 0;}
- uva_10125_Sumsets( 二分 )
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分。
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分
- 二分~~
- 二分
- 二分
- 第十一篇 RMAN笔记之综述
- STM32学习笔记(3):系统时钟和SysTick定时器
- Sql Server 2008 登录解决
- 如何在Excel中仅复制可见单元格
- LightOj 1054 Efficient Pseudo Code
- uva_10125_Sumsets( 二分 )
- sencha Touch 缓存问题解析
- 625这个数字很特别,625的平方等于390625,刚好其末3位是625本身。除了625,还有其它的3位数有这个特征吗?
- 构造函数+析构函数
- 上传图片漏洞
- mysql笔记(一)
- iOS中如何避免图像解压缩的时间开销
- Asterisk专题之:DAHDI与Zaptel
- PureMvc学习(一)