TZOJ 1503 Incredible Cows(折半搜索+二分)
描述
Farmer John is well known for his great cows. Recently, the cows have decided to participate in the Incredible Cows Puzzle Contest (ICPC).
Farmer John wants to divide the cows into two teams, and he wants to minimize the difference of Puzzle Solving Power of two teams.
Puzzle Solving Power of a team is sum of Puzzle Solving Power of cows forming that team.
Help F.J. to find the minimum difference!
输入
The first line of input consists of a single integer T, the number of test-cases. Each test-case consists of a line containing n (2 <= n <= 34), number of cows. n lines follow. i-th line contains the Puzzle Solving Power of i-th cow. Puzzle Solving Power of a cow is a non-negative number less than 10,000,000. There is a blank line between two consecutive test-cases.
输出
For each test-case, output a line containing the minimum difference which can be achieved.
样例输入
2
3
12
6
6
10
123
455
1000
403
234
554
129
454
84
11
样例输出
0
5
题意
把n数分成两堆,使得两堆和的差最小。
题解
n高达34,直接爆搜肯定不行。但是17可以直接爆搜(2^17)。
于是乎,相当于把数组对半拆开,记和为suml和sumr,然后爆搜出两堆的所有情况。
然后就是配对问题了,假设第一堆取出了X,第二堆取出了Y。
答案是最小化函数|(X+Y)-((suml-X)+(sumr-Y))|,化简得到|2X+2Y-suml-sumr|。
我们枚举一个未知数X,那么变成绝对值函数,易得Y>=(suml+sumr)/2-X,于是lower_bound找到最小的Y。
这是最小值在右边的情况,还有在左的情况就是二分得到的Y前一个数。
时间复杂度O(2^17*log(2^17))。
代码
#include<bits/stdc++.h>
using namespace std; #define ll long long
ll a[];
set<ll>se[];
void dfs(int s,int t,bool f,ll sum)
{
if(s>t)
{
se[f].insert(sum);
return;
}
dfs(s+,t,f,sum+a[s]);
dfs(s+,t,f,sum);
}
int main()
{
int n,t;
cin>>t;
while(t--)
{
se[].clear(),se[].clear();
cin>>n;ll suml=,sumr=;
for(int i=;i<=n/;i++)cin>>a[i],suml+=a[i];
for(int i=n/+;i<=n;i++)cin>>a[i],sumr+=a[i];
dfs(,n/,,);dfs(n/+,n,,);
ll min_abs=1e18;
set<ll>::iterator it,itt;
for(auto X:se[])
{
it=se[].lower_bound((suml+sumr)/-X);
itt=it;
if(it!=se[].begin())--itt;
if(it==se[].end())--itt,--it;
min_abs=min(min_abs,min(abs(suml+sumr-*X-*(*it)),abs(suml+sumr-*X-*(*it))));
}
cout<<min_abs<<'\n';
}
return ;
}
TZOJ 1503 Incredible Cows(折半搜索+二分)的更多相关文章
- CODEVS_2144 砝码称重 2 折半搜索+二分查找+哈希
#include<iostream> #include<algorithm> #include<cstring> #include<map> #incl ...
- JS 排序:冒泡、 二分搜索 /折半搜索 half-interval search
冒泡排序: 重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来. var arr = [5,0,-56,900,12]; //大的排序次数 for(var i=0; i& ...
- codeforces912E(折半搜索+双指针+二分答案)
E. Prime Gift E. Prime Gift time limit per test 3.5 seconds memory limit per test 256 megabytes inpu ...
- POJ 2549 Sumsets(折半枚举+二分)
Sumsets Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 11946 Accepted: 3299 Descript ...
- 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...
- [题解](折半搜索)luogu_P4799_BZOJ_4800世界冰球锦标赛
抄的题解 以及参考:https://www.cnblogs.com/ZAGER/p/9827160.html 2^40爆搜过不了,考虑折半搜索,难点在于合并左右的答案,因为有可能答案同时载左右两边,我 ...
- 【bzoj4800】[Ceoi2015]Ice Hockey World Championship 折半搜索
题目描述 有n个物品,m块钱,给定每个物品的价格,求买物品的方案数. 输入 第一行两个数n,m代表物品数量及钱数 第二行n个数,代表每个物品的价格 n<=40,m<=10^18 输出 一行 ...
- bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 462 Solv ...
- poj3977(折半枚举+二分查找)
题目链接:https://vjudge.net/problem/POJ-3977 题意:给一个大小<=35的集合,找一个非空子集合,使得子集合元素和的绝对值最小,如果有多个这样的集合,找元素个数 ...
随机推荐
- PowerDesigner导出所有表到Excel(同一表格)
'****************************************************************************** '* File: pdm2excel.v ...
- java读取字符串,生成txt文件
/** * 读取字符串,生成txt 文件 已解决未设置编码时,在项目中直接打开文件,中文乱码问题 * WriteText.writeToText(musicInfo,fileName)直接调用 * * ...
- 面试系列14 redis的过期策略都有哪些
(1)设置过期时间 我们set key的时候,都可以给一个expire time,就是过期时间,指定这个key比如说只能存活1个小时?10分钟?这个很有用,我们自己可以指定缓存到期就失效. 如果假设你 ...
- Spark中使用Java编程的常用方法
原文引自:http://blog.sina.com.cn/s/blog_628cc2b70102w9up.html 一.初始化SparkContext System.setProperty(" ...
- 2018-8-10-如何删除错误提交的-git-大文件
title author date CreateTime categories 如何删除错误提交的 git 大文件 lindexi 2018-08-10 19:16:51 +0800 2018-2-1 ...
- scull 的内存使用
scull 使用的内存区, 也称为一个设备, 长度可变. 你写的越多, 它增长越多; 通过使用 一个短文件覆盖设备来进行修整. scull 驱动引入 2 个核心函数来管理 Linux 内核中的内存. ...
- BP 算法之一种直观的解释
0. 前言 之前上模式识别课程的时候,老师也讲过 MLP 的 BP 算法, 但是 ppt 过得太快,只有一个大概印象.后来课下自己也尝试看了一下 stanford deep learning 的 wi ...
- Android开发 处理拍照完成后的照片角度
private void initImageAngle(){ Bitmap imageBitmap = BitmapFactory.decodeFile(FilePathSession.getFace ...
- bootstrap table 实现固定悬浮table 表头并可以水平滚动
在开发项目中,需要将表格头部固定,而且表格大多数情况下是会水平滚动的.项目的css框架是bootstrap 3,故也可以叫做bootstrap table. 需要实现的是:表格头部固定,并且支持水平滚 ...
- html--div里让图片水平居中
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...