条件a+b == d-c,O(n*n)枚举出所有的形如a+b的和,然后从大到小枚举d,在枚举c,二分找d-c。

主要是要用容斥排除c和d出现在和中,详细的过程见注释。

复杂度为O(n^2log(n^2))。

/*********************************************************
*            ------------------                          *
*   author AbyssalFish                                   *
**********************************************************/
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<queue>
#include<vector>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<algorithm>
#include<cmath>
#include<numeric>
using namespace std;/*
容斥原理去重复
左边是枚举出来的,保证不等
可能出现重复的情况有:
d 和 c同时出现
case 1 d+c == d-c -> c == 0其中一个出现
前提
a or b != c or dcase2  a+d == d-c, -> a == -c , 必要条件 a != c -> c != 0 如果不满足这个条件:找到的可能是d == d
case3  d+b == d-c, -> b == -c
case 2 3互斥case4  a+c == d-c, -> a == d-2*c, 必要条件 a != d -> c != 0
case5  c+b == d-c -> b == d-2*c
case 4 5互斥case (2,3,4,5) 1互斥
*/const int maxn = 1e3, INF = 536870911+5;
int n;
int e[maxn+1], tab[maxn*maxn>>1];
bool vis[maxn];int solve()
{sort(e,e+n);int i, j, a, c, d, k;int sz = 0;for(i = 1; i < n; i++){a = e[i];for(j = 0; j < i; j++){tab[sz++] = a+e[j];}}sort(tab,tab+sz);e[n] = e[n]-1;for(j = 0; j < n; j++) {c = -e[j];vis[j] = (*lower_bound(e,e+n,c) == c); // c == 0 || -c == a or b
    }tab[sz+1] = tab[sz] = tab[sz-1]-1;for(i = n; i--; ){d = e[i];for(j = 2; j < n; j++)if(i!=j){c = e[j];a = d-c;k = lower_bound(tab,tab+sz,a)-tab;if(c){if(vis[j]) k++;if(*lower_bound(e,e+n,a-c) == a-c) k++;}else k++;if(a == tab[k]) return d;}}return INF;
}//#define LOCAL
int main()
{
#ifdef LOCALfreopen("in.txt","r",stdin);
#endifwhile(scanf("%d",&n),n){for(int i = 0; i < n; i++) scanf("%d", e+i);int res = solve();if(res < INF) printf("%d\n", res);else puts("no solution");}return 0;
}

伪二分O(n^3) ???

int solve()
{sort(e,e+n);int i, j, sum, lb, ub, tsum;for(i = n; i--; ){for(j = 2; j < n; j++)if(i!=j){sum = e[i]-e[j];for(lb = 0,ub = j-1; lb < ub; ){ //状态是DAGtsum = e[lb]+e[ub];if(tsum == sum) return e[i];tsum > sum ? ub--:lb++; //O(n)
            }}}return INF;
}

转载于:https://www.cnblogs.com/jerryRey/p/4975779.html

POJ - 2549 Sumsets相关推荐

  1. 翻译D23(附AC码 POJ 1551:Sumsets)

    " Ctrl AC!一起 AC!" 原题:Sumsets 我的翻译: 描述: 给定S,一组整数,求最大的d,使a+b+c=d,其中a.b.c和d是S的不同元素. 输入: 多个S,每 ...

  2. POJ 2229 Sumsets

    题目链接 题意 给定一个数字,问用2的次方数凑,一共有几种情况 例如7: 1) 1+1+1+1+1+1+1 2) 1+1+1+1+1+2 3) 1+1+1+2+2 4) 1+1+1+4 5) 1+2+ ...

  3. poj 2229 Sumsets(类似于n的m划分)

    传送门 •题意 将一个数N分解为2的幂之和共有几种分法? •题解 定义dp[ i ]为 i 的分解方案数. 初始化dp[0] = 20 = 1; 状态转移方程为: for i : 1 to N 若 i ...

  4. POJ 2229 Sumsets(递推,找规律)

    构造,递推,因为划分是合并的逆过程,考虑怎么合并. 先把N展开成全部为N个1 然后合并,因为和顺序无关,所以只和出现次数有关 情况有点多并且为了避免重复,分类,C[i]表示序列中最大的数为2^i时的方 ...

  5. 《挑战程序设计竞赛(第2版)》习题册攻略

    本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...

  6. 备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)

    挑战程序设计竞赛(第2版)练习题 tips:难度(个人主观判断): 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的"动态规划" ...

  7. python socket清空接收缓冲区_Python网络编程——修改套接字发送和接收的缓冲区大小...

    很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...

  8. DP:Sumsets(POJ 2229)

     数的集合问题 题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式? 这一题一看,天啦太简单了,完全背包?是不是? 不过的确这一题可以用完全背包来想,但是交题绝对是TLE ...

  9. Sumsets POJ - 2229(计数dp)

    题意: 给一个数,是集合的总数和,集合元素只能为2的次幂数,问这样的集合有多少? 题目: Farmer John commanded his cows to search for different ...

最新文章

  1. 博客中最快捷的公式显示方式:Mathjax + Lyx
  2. LeetCode 973. K Closest Points to Origin--TopK 问题--最小堆--C++,Python解法
  3. mysql插入ㄖ_原生JavaScript代码100个实例
  4. 【深度学习】保姆级教程,用PyTorch构建第一个神经网络
  5. matlab命令 脑电波,基于Matlab的脑电波信号处理
  6. 【转载】通往性能优化的天堂-地狱 JOIN方法说明
  7. jsp+左间距_DIV间距设置
  8. [leetcode]Two Sum @ Python
  9. (戴尔灵越7572)笔记本外扩显示器以后,笔记本没有声音了的解决办法
  10. 德宝会员管理系统服务器密码是多少,易展路由器管理员密码是多少?
  11. Java轻量级缓存Ehcache与SpringBoot整合
  12. 中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...
  13. 解除pdf文件打印限制
  14. 对传统优化算法的一些总结(上)
  15. 型臂x线机结构图解_织女必备 | 从入门到高级的毛衣编织图解,这里全都有!...
  16. .bxl文件导入Altium Designer的方法,及错误解决
  17. HP孙振耀退休感言(转载)
  18. 【操作教程】RTSP/GB28181/SDK/Ehome协议人脸识别/车牌识别视频智能分析系统EasyCVR如何获取播放地址和流地址?
  19. 在岸人民币(CNY)和离岸人民币(CNH)
  20. 后端接口返回一张图片

热门文章

  1. Swift Property Wrapper 属性包装器
  2. UIView 的布局与绘制显示相关方法调用时机
  3. Go语言构建json和解析json实例
  4. java的异常与记录日志
  5. Node入门--6--文件系统-创建删除
  6. Vim 自动文件头注释与模板定义
  7. C++ Double Ended Queues(双向队列)
  8. PHP文件打包类和实例
  9. 《幸福就在你身边》第八课、幸福比成功更重要【哈佛大学幸福课精华】
  10. 百战百胜:人生10个成功秘诀