FZU 11月月赛D题:双向搜索+二分

/*

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

*/

题目大意:

有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[2][32][70000];
int nn[2][32];
int v[32],w[32];
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?(-1):1;
    dfs(now+1,e,num,ans-p*w[now],flag);
    dfs(now+1,e,num+1,ans+p*v[now],flag);
}
void ini()
{
    scanf("%d",&n);
    for(int i=0;i<n;i++)
    {
        scanf("%d",v+i);
    }
    for(int i=0;i<n;i++)
    {
        scanf("%d",w+i);
    }
}
int fun(int val,int pos)
{
    int res=inf;
    int num=nn[1][pos];
    if(val>a[1][pos][num-1])
    {
        return abs(val-a[1][pos][num-1]);
    }
    int k=upper_bound(a[1][pos],a[1][pos]+num,val)-a[1][pos];
    res=min(res,abs(val-a[1][pos][k]));
    if(k)
    {
        res=min(res,abs(val-a[1][pos][k-1]));
    }
    return res;
}
void solve()
{
    int ans=inf;
    memset(nn,0,sizeof(nn));
    dfs(0,n/2-1,0,0,0);
    dfs(n/2,n-1,0,0,1);
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<16;j++)
        {
            sort(a[i][j],a[i][j]+nn[i][j]);
        }
    }
    for(int i=0;i<=n/2;i++)
    {
        for(int j=0;j<nn[0][i];j++)
        {
            int x=a[0][i][j];
            int k=n/2-i;
            ans=min(ans,fun(x,k));
            if(n%2)
            {
                k=n/2+1-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 0;
}
时间: 2024-12-09 15:50:12

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

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

csu-2018年11月月赛Round2-div2题解 A(2193):昆虫繁殖 Description 科学家在热带森林中发现了一种特殊的昆虫,这种昆虫的繁殖能力很强.每对成虫过x个月产y对卵,每对卵要过两个月长成成虫.假设每个成虫不死,第一个月只有一对成虫,且卵长成成虫后的第一个月不产卵(过X个月产卵),问过Z个月以后,共有成虫多少对?0=<X<=20,1<=Y<=20,X=<Z<=50 Input 单组数据 x,y,z的数值 Output 过Z个月以后,共有成虫对

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

csu-2018年11月月赛Round2-div1题解 A(2191):Wells的积木游戏 Description Wells有一堆N个积木,标号1~N,每个标号只出现一次 由于Wells是手残党,所以每次只能取出一块积木放在积木顶层 现在Wells想知道至少需要操作几次可以把积木堆成从顶至底标号升序 不论什么都很菜的Wells显然不知道怎么做 所以作为人生赢家的你义不容辞的决定帮助可怜的Wells Input 第一行一个正整数N 接下来N行,从顶至底描述每块积木的标号 Output 输出一行

洛谷11月月赛round.1

太感动了#2 thwfhk 240 (801ms) 100 100 40 又一张明信片,话说10月的怎么还没收到 P2246 SAC#1 - Hello World(升级版) 题目背景 一天,智障的pipapi正在看某辣鸡讲义学程序设计. 题目描述 在讲义的某一面,他看见了一篇文章.这篇文章由英文字母(大小写均有).数字.和空白字符(制表/空格/回车)构成. pipapi想起了他最近刚刚学会写的Hello World程序.他非常好奇,这篇文章中,“HelloWorld”作为子序列到底出现过多少次

FOJ 11月月赛题解

抽空在vjudge上做了这套题.剩下FZU 2208数论题不会. FZU 2205 这是个想法题,每次可以在上一次基础上加上边数/2的新边. 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <queue

code+11月月赛

T1 SB题 1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<ctime> 5 #include<iostream> 6 #include<algorithm> 7 #include<queue> 8 #include<set> 9 #define inf (0x7fffffff) 10 #define l(a) ((a)&

11月月赛

A-HDU1087   http://acm.hdu.edu.cn/showproblem.php?pid=1087 相当于从数组a中找一个最优序列,我们设要找的序列为A,序列A满足两个条件,一是A中的元素大小满足单调递增,二是A中所有元素的和最大,输出这个最大值. 令f[i]表示以第i个元素结尾的A序列的最大值,则有f[i]=MAX{ f[j]+a[i]  |  j<i }   ans=MAX{f[i]}; 1 *#include<bits/stdc++.h> 2 using name

洛咕11月月赛部分题解 By cellur925

听说是你谷史上最水月赛?我不听我最菜 T1:终于结束的起点 月天歌名好评 给你一个模数 \(M\),请你求出最小的 \(n > 0\),使得\(fib(n)\) \(mod\) \(m=0\),\(fib(n+1)\) \(mod\) \(m=1\). 数学题,开始还想打表验证下,但是我不会告诉你我打表的时候没有很及时地取膜,然后中间有结果溢出,耽误了很长时间,企图找了很久规律.结果发现暴力就能过.hhh. 这个故事告诉我们要及时取膜! #include<cstdio> #include

11月刷题总结

这是11月的坑...现在来填... noip考跪...希望省选rp++ (11月刷了不少水题... 动态规划+递推: [BZOJ]1072: [SCOI2007]排列perm(状压dp+特殊的技巧) [BZOJ]1068: [SCOI2007]压缩(dp) [BZOJ]1088: [SCOI2005]扫雷Mine(递推) [BZOJ]1096: [ZJOI2007]仓库建设(dp+斜率优化) [BZOJ]1037: [ZJOI2008]生日聚会Party(递推+特殊的技巧) [BZOJ]1009

2017年11月11日软考网络工程师案例分析真题及答案解析

[徐朋出品,必属精品]软考徐朋老师全网最先发布2017年11月11日软考网络工程师案例分析真题及答案解析,是全网最清新版本.详细讲解了2017年11月11日最新开考的软考网络工程师案例分析真题及答案.课件中对每一道真题都进行了详细的解析讲解,考后几周是学员记忆答案的最关键时间点,第一时间发布真题及答案帮助广大考生准确评估自己的考试结果及对未来参加考试的学员展示最新的考试趋势等.下载地址:http://down.51cto.com/data/2340424