/*

双向搜索感觉是个不错的技巧啊

*/

题目大意:

有n的物品(n<=30),平均(两个人得到的物品差不能大于1)分给两个人,每个物品在每个人心目中的价值分别为(vi,wi)

问两人心目中的价值差最小是多少。

分析:

直接暴搜目测会超时

想到先搜索前一半,用数组a[0][i]保存第一个人在前半段取 i 个物品两个人的差的所有情况;

再搜索后一半保存两个人的差的相反数,用相同的规则保存在a[1][]中。

要想总差最小只需要

a[0][i]-a[1][num-i] (num=n/2或 n/2+1)的绝对值最小即可..

找这个最小值可以用二分查找优化

然后就不会超时了

ac代码:

#include <iostream>
#include <stdio.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<ctype.h>
using namespace std;
#define inf 500000000
int a[][][];
int nn[][];
int v[],w[];
int n;
void dfs(int now,int e,int num,int ans,int flag)
{
if(now>e)
{
a[flag][num][nn[flag][num]++]=ans;
return;
}
int p=flag?(-):;
dfs(now+,e,num,ans-p*w[now],flag);
dfs(now+,e,num+,ans+p*v[now],flag);
}
void ini()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
scanf("%d",v+i);
}
for(int i=;i<n;i++)
{
scanf("%d",w+i);
}
}
int fun(int val,int pos)
{
int res=inf;
int num=nn[][pos];
if(val>a[][pos][num-])
{
return abs(val-a[][pos][num-]);
}
int k=upper_bound(a[][pos],a[][pos]+num,val)-a[][pos];
res=min(res,abs(val-a[][pos][k]));
if(k)
{
res=min(res,abs(val-a[][pos][k-]));
}
return res;
}
void solve()
{
int ans=inf;
memset(nn,,sizeof(nn));
dfs(,n/-,,,);
dfs(n/,n-,,,);
for(int i=;i<;i++)
{
for(int j=;j<;j++)
{
sort(a[i][j],a[i][j]+nn[i][j]);
}
}
for(int i=;i<=n/;i++)
{
for(int j=;j<nn[][i];j++)
{
int x=a[][i][j];
int k=n/-i;
ans=min(ans,fun(x,k));
if(n%)
{
k=n/+-i;
ans=min(ans,fun(x,k));
}
}
}
printf("%d\n",ans);
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif
int t;
scanf("%d",&t);
while(t--)
{
ini();
solve();
}
return ;
}

FZU 11月月赛D题:双向搜索+二分的更多相关文章

  1. BZOJ5090 组题 BZOJ2017年11月月赛 二分答案 单调队列

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5090 11月月赛A题 题意概括 给出n个数. 求连续区间(长度大于等于k)最大平均值. 题解 这题 ...

  2. BZOJ5091 摘苹果 BZOJ2017年11月月赛 概率,期望

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ5091 11月月赛B题 题意概括 题解 代码 #include <cstring> #i ...

  3. csu-2018年11月月赛Round2-div1题解

    csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党, ...

  4. csu-2018年11月月赛Round2-div2题解

    csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对 ...

  5. 「P4996」「洛谷11月月赛」 咕咕咕(数论

    题目描述 小 F 是一个能鸽善鹉的同学,他经常把事情拖到最后一天才去做,导致他的某些日子总是非常匆忙. 比如,时间回溯到了 2018 年 11 月 3 日.小 F 望着自己的任务清单: 看 iG 夺冠 ...

  6. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

  7. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  8. LG 11 月 月赛 II T4

    LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...

  9. 洛谷11月月赛round.1

    太感动了#2 thwfhk 240 (801ms) 100 100 40   又一张明信片,话说10月的怎么还没收到   P2246 SAC#1 - Hello World(升级版) 题目背景 一天, ...

随机推荐

  1. 高仿“点触验证码”做的一个静态Html例子

    先上源码: <html> <head> <title>TouClick - Designed By MrChu</title> <meta htt ...

  2. Android入门之ActionBar实现Tab导航

    效果图: <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android=&qu ...

  3. [Angular 2] Managing State in RxJS with StartWith and Scan

    The scan operator in RxJS is the main key to managing values and states in your stream. Scan behaves ...

  4. Tomcat jdbc pool配置

    Tomcat jdbc pool是apache在tomcat7版本中启用的新连接池,用它来解决以往DBCP无法解决的一些问题. Tomcat jdbc pool的优点: (1)    tomcat j ...

  5. MySQL(12):windows下解决mysql忘记密码

    mysql有时候忘记密码了怎么办?我给出案例和说明!一下就解决了!    Windows下的实际操作如下 : 1. 关闭正在运行的MySQL.  2. 打开DOS窗口,转到mysql\bin目录. 3 ...

  6. 【网络流#6】POJ 3041 Asteroids 二分图最大匹配 - 《挑战程序设计竞赛》例题

    学习网络流中ing...作为初学者练习是不可少的~~~构图方法因为书上很详细了,所以就简单说一说 把光束作为图的顶点,小行星当做连接顶点的边,建图,由于 最小顶点覆盖 等于 二分图最大匹配 ,因此求二 ...

  7. codevs 3693 数三角形

    /* n*m个点中选3个 再排除三点共线 共线分两类 1 在横线或者竖线上 m*C(n,3) n*C(m,3) 2 在对角线上 这个比较麻烦 以为对角线和矩阵是一一对应的 我们转化成求矩阵 并且保证有 ...

  8. ASP.Net中的编码与解码

    当javascript传递的参数中有中文时,服务端获得的将是乱码,此时需要用到编码和解码 javascript中编码与解码的三种方法 escape方法返回一个可在所有计算机上读取的编码 String ...

  9. “The SQL Server license agreenment cannot be located for the selected edition.”MSSQL安装问题

    今天老邹又来吐槽了.今天不和IE7较劲了.说点别的吧. 我呢什么软件都喜欢装最新版的,这部刚出来windows 8.1就赶紧装上了,随后就用上了vs2013.前天看到新闻说微软已经发布了sql ser ...

  10. 逆波兰表达式 java

    描述  逆波兰表达式是一种把运算符前置的算术表达式,例如普通的表达式2 + 3的逆波兰表示法为+ 2 3.逆波兰表达式的优点是运算符之间不必有优先级关系, 也不必用括号改变运算次序,例如(2 + 3) ...