qwb与李主席 状压+二分

news/2024/7/3 7:40:03

Description

qwb和李主席打算平分一堆宝藏,他们想确保分配公平,可惜他们都太懒了,你能帮助他们嘛?

Input

输入包含多组测试数据,处理到文件结束。

每组测试数据的第一行是一个正整数N(0 <= N <=36 )表示物品的总个数.。

接下来输入N个浮点数(最多精确到分),表示每个物品的价值V(0 < V <= 1e9)。

Output

对于每组测试数据,输出能够使qwb和李主席各自所得到的物品的总价值之差的最小值(精确到分),每组测试数据输出占一行。

Sample Input
3 0.01 0.1 1
2 1 1

Sample Output
0.89
0.00

HINT

首先年轻的我会想到dp,可能因为n很小 v很大,所以 背包是不可行的,只能用二分查找后者dfs。
对,因为是只有两个人,所以你会想到枚举一个,再二分sum/2-前面的是完全可行的。

因为数据范围是 36 单纯的状压肯定会超时。
然后我们可以想到一个人拿东西可能全在左边拿,或者全在右边拿。或者既在左边又在中间拿,对,说了和没说是一样的。但是这个揭露一个关键点,可以把这个东西枚举一边,二分另一边。所以就简单了,而且一边进行18个进行状压枚举,完全可以把所有的状态都弄出来。然后枚举一边,再二分另一边得到最正确的结果。
第一个坑点,因为是浮点数,要求精度比较高,精确到两位后会到11位,可以用long double,也可以化为 longlong 化成整型,因为后面要进行/2,所以200就很完美了。另一个点是 求两边相差最小,abs(sum-2(一个人的物品价值就好))

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

ll a[1<<18],b[1<<18],c[1<<18],d[1<<18];

void gao(ll g[],ll h[],int n)
{
    ll gg=1<<n;
    for(int i=0;i<gg;i++)
    {
        for(int j=0;j<n;j++)
        {
            if(i&(1<<j)) 
                h[i]+=g[j];
        }
    }
}



int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
    ll cnta=0,cntb=0;
    ll sum=0;

    for(int i=0;i<n;i++)
    {
        double x;
        scanf("%lf",&x);
        ll y=round(x*200);
        sum+=y;
        if(i<=n/2) c[cnta++]=y;
        else d[cntb++]=y;
    }
    gao(c,a,cnta);
    gao(d,b,cntb);
    cnta=(1<<cnta);
    cntb=(1<<cntb);
    sort(a,a+cnta);
    ll minn=1e18;
    for(int i=0;i<cntb;i++)
    {
        int pos=lower_bound(a,a+cnta,sum/2-b[i])-a;
        minn=min(minn,abs(sum-2*(b[i]+a[pos])));
        if(pos>=1) minn=min(minn,abs(sum-2*(b[i]+a[pos-1])));
    }
    printf("%.2f\n",minn*1.0/200 );
    }
}

http://www.niftyadmin.cn/n/3617379.html

相关文章

Confluence 6 用户目录图例 - 可读写连接 LDAP

上面的图&#xff1a;Confluence 连接到一个 LDAP 目录。 https://www.cwiki.us/display/CONFLUENCEWIKI/DiagramsofPossibleConfigurationsforUserManagement 转载于:https://www.cnblogs.com/huyuchengus/p/8879063.html

BZOJ 1012 线段树||单调队列

非常裸的线段树 || 单调队列&#xff1a; 假设一个节点在队列中既没有时间优势&#xff08;早点入队&#xff09;也没有值优势&#xff08;值更大&#xff09;&#xff0c;那么显然不管在如何的情况下都不会被选为最大值。 既然它仅仅在末尾选。那么自然能够满足以上的条件。 …

C语言面试题分类-链表

链表的创建,清空,插入,删除 typedef int (* __compfunc)(const void *, const void *);//Traverse list. Fast macro to traverse the list.#define linklist_next(al) \ ((al) && ((al)(al)->next) ? (al)->data : NULL)typedef struct linklist{ void *…

舞蹈链(DLX)学习笔记

简介 用途&#xff1a;解决精确/重复覆盖问题&#xff08;某一列含有恰好1个1&#xff09;&#xff0c;全称Dancing Links X&#xff0c;X是未知搜索算法的意思。 洛谷模板题 超详细的算法图解 实际上并不难&#xff0c;就是 暴搜 十字链表维护。 把所有的1拿出来建十字链…

qwb与整数对 (思维枚举难)

Problem L: qwb与整数对 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 214 Solved: 34 [Submit][Status][Web Board] Description qwb又遇到了一道数学难题&#xff0c;你能帮助他吗&#xff1f; 给出两个整数n和m&#xff0c;请统计满足0&#xff1c;a&#xff1c;…

[读书笔记]《Android开发艺术探索》第十五章笔记

Android性能优化 Android不可能无限制的使用内存和CPU资源&#xff0c;过多的使用内存会导致内存溢出&#xff0c;即OOM。而过多的使用CPU资源&#xff0c;通常是指做大量的耗时任务&#xff0c;会导致手机变的卡顿甚至出现程序无法响应的情况&#xff0c;即ANR。15.1.1布局优化…

HDU5462 Manors【半平面交】

题目描述&#xff1a; HDU5462 Manors nnn个人&#xff0c;每个人mmm个旗子坐标为 xi,j,yi,jx_{i,j},y_{i,j}xi,j​,yi,j​&#xff0c;fi(x,y)∑j1m(x−xi,j)2(y−yi,j)2f_i(x,y)\sum_{j1}^m(x-x_{i,j})^2(y-y_{i,j})^2fi​(x,y)∑j1m​(x−xi,j​)2(y−yi,j​)2 点(x,y)(x,…

HDU 2036 改革春风吹满地[多边形的面积]

改革春风吹满地 时限&#xff1a;1000ms Problem Description“ 改革春风吹满地,不会AC没关系;实在不行回老家&#xff0c;还有一亩三分地。谢谢!&#xff08;乐队奏乐&#xff09;”话说部分学生心态极好&#xff0c;每天就知道游戏&#xff0c;这次考试如此简单的题目&#x…