POJ - 2549 Sumsets
条件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相关推荐
- 翻译D23(附AC码 POJ 1551:Sumsets)
" Ctrl AC!一起 AC!" 原题:Sumsets 我的翻译: 描述: 给定S,一组整数,求最大的d,使a+b+c=d,其中a.b.c和d是S的不同元素. 输入: 多个S,每 ...
- 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+ ...
- poj 2229 Sumsets(类似于n的m划分)
传送门 •题意 将一个数N分解为2的幂之和共有几种分法? •题解 定义dp[ i ]为 i 的分解方案数. 初始化dp[0] = 20 = 1; 状态转移方程为: for i : 1 to N 若 i ...
- POJ 2229 Sumsets(递推,找规律)
构造,递推,因为划分是合并的逆过程,考虑怎么合并. 先把N展开成全部为N个1 然后合并,因为和顺序无关,所以只和出现次数有关 情况有点多并且为了避免重复,分类,C[i]表示序列中最大的数为2^i时的方 ...
- 《挑战程序设计竞赛(第2版)》习题册攻略
本项目来源于GitHub 链接: 项目GitHub链接 1 前言 项目为<挑战程序设计竞赛(第2版)>习题册攻略,已完结.可配合书籍或笔记,系统学习算法. 题量:约200道,代码注释内含详 ...
- 备战ccpc分站赛:秦皇岛和威海站(数论模块和dp模块)
挑战程序设计竞赛(第2版)练习题 tips:难度(个人主观判断): 简单* 简单但卡思维 ** 中 *** 中稍加思考 **** 难 ***** 1 . 记录结果再利用的"动态规划" ...
- python socket清空接收缓冲区_Python网络编程——修改套接字发送和接收的缓冲区大小...
很多情况下,默认的套接字缓冲区大小可能不够用.此时,可以将默认的套接字缓冲区大小改成一个更合适的值. 1. 代码 # ! /usr/bin/env python # -*- coding: utf-8 ...
- DP:Sumsets(POJ 2229)
数的集合问题 题目大意:给定你一个整数m,你只能用2的k次幂来组合这个数,问你有多少种组合方式? 这一题一看,天啦太简单了,完全背包?是不是? 不过的确这一题可以用完全背包来想,但是交题绝对是TLE ...
- Sumsets POJ - 2229(计数dp)
题意: 给一个数,是集合的总数和,集合元素只能为2的次幂数,问这样的集合有多少? 题目: Farmer John commanded his cows to search for different ...
最新文章
- 博客中最快捷的公式显示方式:Mathjax + Lyx
- LeetCode 973. K Closest Points to Origin--TopK 问题--最小堆--C++,Python解法
- mysql插入ㄖ_原生JavaScript代码100个实例
- 【深度学习】保姆级教程,用PyTorch构建第一个神经网络
- matlab命令 脑电波,基于Matlab的脑电波信号处理
- 【转载】通往性能优化的天堂-地狱 JOIN方法说明
- jsp+左间距_DIV间距设置
- [leetcode]Two Sum @ Python
- (戴尔灵越7572)笔记本外扩显示器以后,笔记本没有声音了的解决办法
- 德宝会员管理系统服务器密码是多少,易展路由器管理员密码是多少?
- Java轻量级缓存Ehcache与SpringBoot整合
- 中软国际软件测试培训中心,中软国际准员工培养计划C++开发/软件测试方向开班典礼...
- 解除pdf文件打印限制
- 对传统优化算法的一些总结(上)
- 型臂x线机结构图解_织女必备 | 从入门到高级的毛衣编织图解,这里全都有!...
- .bxl文件导入Altium Designer的方法,及错误解决
- HP孙振耀退休感言(转载)
- 【操作教程】RTSP/GB28181/SDK/Ehome协议人脸识别/车牌识别视频智能分析系统EasyCVR如何获取播放地址和流地址?
- 在岸人民币(CNY)和离岸人民币(CNH)
- 后端接口返回一张图片