首页 > 其他分享 >E - Lucky bag

E - Lucky bag

时间:2023-12-11 17:34:39浏览次数:32  
标签:bags bar items sum Lucky lucky bag frac

E - Lucky bag

Problem Statement

AtCoder Inc. sells merchandise on its online shop.

There are $N$ items remaining in the company. The weight of the $i$-th item $(1\leq i\leq N)$ is $W_i$.

Takahashi will sell these items as $D$ lucky bags.
He wants to minimize the variance of the total weights of the items in the lucky bags.
Here, the variance is defined as $V=\frac{1}{D}\displaystyle\sum_{i=1}^D (x_i-\bar{x})^2$, where $x_1,x_2,\ldots,x_D$ are the total weights of the items in the lucky bags, and $\bar{x}=\frac{1}{D}(x_1+x_2+\cdots+x_D)$ is the average of $x_1,x_2,\ldots,x_D$.

Find the variance of the total weights of the items in the lucky bags when the items are divided to minimize this value.
It is acceptable to have empty lucky bags (in which case the total weight of the items in that bag is defined as $0$),
but each item must be in exactly one of the $D$ lucky bags.

Constraints

  • $2 \leq D\leq N\leq 15$
  • $1 \leq W_i\leq 10^8$
  • All input values are integers.

Input

The input is given from Standard Input in the following format:

$N$ $D$
$W_1$ $W_2$ $\ldots$ $W_N$

Output

Print the variance of the total weights of the items in the lucky bags when the items are divided to minimize this value.
Your output will be considered correct if the absolute or relative error from the true value is at most $10^{-6}$.


Sample Input 1

5 3
3 5 3 6 3

Sample Output 1

0.888888888888889

If you put the first and third items in the first lucky bag, the second and fifth items in the second lucky bag, and the fourth item in the third lucky bag, the total weight of the items in the bags are $6$, $8$, and $6$, respectively.

Then, the average weight is $\frac{1}{3}(6+8+6)=\frac{20}{3}$,
and the variance is $\frac{1}{3}\left\{\left(6-\frac{20}{3}\right)^2+\left(8-\frac{20}{3}\right)^2+\left(6-\frac{20}{3}\right)^2 \right\}=\frac{8}{9}=0.888888\ldots$, which is the minimum.

Note that multiple items may have the same weight, and that each item must be in one of the lucky bags.

 

解题思路

  为了方便这里用 $m$ 来表示题目中的 $D$,且物品和分组的下标都从 $0$ 开始。

  容易知道 $\bar{x} = \frac{1}{m}\sum\limits_{i=0}^{m-1}{x_i} = \frac{1}{m}\sum\limits_{i=0}^{n-1}{w_i}$,因此 $\bar{x}$ 是一个常量。所以要使得式子 $\frac{1}{m}\sum\limits_{i=0}^{m-1}{(x_i - \bar{x})^2}$ 尽可能小,只需让 $\sum\limits_{i=0}^{m-1}{(x_i - \bar{x})^2}$ 尽可能小。因此实际上要考虑的是每组应该放哪些物品才能使得式子尽可能小。

  考虑动态规划,定义 $f(i,j)$ 表示已将状态 $j$ 所表示的物品放入前 $i$ 组的所有方案中 $\sum\limits_{k=0}^{i}{(x_k - \bar{x})^2}$ 的最小值,其中 $j$ 是一个 $n$ 位的二进制数,如果第 $k$ 位是 $1$ 表示已选第 $k$ 个物品。为了方便这里定义 $s_j$ 表示状态 $j$ 中已选物品的总价值,根据第 $i$ 组含有哪些物品进行状态划分,因此有状态转移方程 $$\begin{cases} f(i,j) = (s_j - \bar{x})^2 ,&i=0 \\ f(i,j) = \min\limits_{k \subset j}\left\{ f(i-1,j \oplus k) + (s_k - \bar{x})^2 \right\} ,&i>0 \end{cases}$$

  其中 $k$ 也是二进制状态,表示 $j$ 的二进制状态的子集。例如 $(101)_2$,那么其子集就是 $(101)_2$,$(100)_2$,$(001)_2$,$(000)_2$。用 $\operatorname{popcount}(j)$ 表示二进制数 $j$ 中 $1$ 的数量,那么 $j$ 的子集数量就是 $2^{\operatorname{popcount}(j)}$。遍历 $j$ 的子集的方法和证明请参考链接

  整个 dp 的时间复杂度是 $O\left( m \cdot \sum\limits_{i=0}^{n}{2^i \cdot C_{n}^{i}}  \right) = O(m \cdot 3^n)$。其中 $\sum\limits_{i=0}^{n}{2^i \cdot C_{n}^{i}}$ 可由二项式定理 $(1 + 2)^n$ 推出。计算量上限大概是 $2 \times 10^8$ 级别,在 atcoder 上 $300 \; ms$ 左右就可以跑出结果。

  最终答案就是 $\frac{1}{m} \cdot f(m-1, \, 2^n-1)$。

  AC 代码如下:

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

typedef long long LL;

const int N = 15, M = 1 << 15;

int w[N], s[M];
double f[N][M];

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    for (int i = 0; i < n; i++) {
        scanf("%d", w + i);
    }
    for (int i = 0; i < 1 << n; i++) {
        for (int j = 0; j < n; j++) {
            if (i >> j & 1) s[i] += w[j];
        }
    }
    double avg = 1.0 * s[(1 << n) - 1] / m;
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < 1 << n; j++) {
            if (!i) {
                f[i][j] = (s[j] - avg) * (s[j] - avg);
            }
            else {
                f[i][j] = f[i - 1][j] + avg * avg;
                for (int k = j; k; k = (k - 1) & j) {
                    f[i][j] = min(f[i][j], f[i - 1][j ^ k] + (s[k] - avg) * (s[k] - avg));
                }
            }
        }
    }
    printf("%.10f", f[m - 1][(1 << n) - 1] / m);
    
    return 0;
}

 

参考资料

  Editorial - AtCoder Beginner Contest 332:https://atcoder.jp/contests/abc332/editorial/7929

标签:bags,bar,items,sum,Lucky,lucky,bag,frac
From: https://www.cnblogs.com/onlyblues/p/17894691.html

相关文章

  • foxy与galactic解析rosbag的不同之处
    前言foxy和galactic版本在rosbag2_storage这个包的调整有点大(头文件及接口的命名空间),下面的代码仅供参考使用foxy#include"db3_reader.h"#include<pcl/common/transforms.h>#include<pcl/point_types.h>#include<pcl_conversions/pcl_conversions.h>#include<rosba......
  • RoS_robag中的msg与protobuf
    ROS与protobuf博客园https://www.cnblogs.com/bag格式bag包就是为了录制消息,而消息的保存和读取就涉及到一个广义上的问题序列化和反序列化Bag包的第一行是人眼可以识别的版本号,后面紧跟着的是一系列记录序列#ROSBAGV2.0<record1><record2>....<recordN><rec......
  • CF1766D Lucky Chains
    CF1766DLuckyChains有某位特别爱RE的同学问的老师,由此引发了一场血案主打的就是一坚持不懈(悲题意给出两个正整数$(x,y)$,满足$(x,y),(x+1,y+1),(x+2,y+2),\dots,(x+k,y+k)$都是互质的,直到$(x+k+1,y+k+1)$起不互质问$k$的值,或指出这个互质的序列长度为$0$或是无限......
  • 封装 luckysheet 组件
    一维数组和二维数组根据luckysheet.getAllSheets()获得所有的数据表数组,其中:cellData是一维数组data是二维数组代码父组件<template><divclass="app-container"v-hasPermi="['proMana:directory:detail:proHome']"><!--项目首页,projectId:......
  • luckysheet 的安装
    前言最近有需求,把el-table和vxe-table替换为luckysheet。据说这个可以实现和excel的互相复制粘贴,便于用户操作。官方文档中Luckysheet安装有两种方式:cdn引入:有可能不是最新的,需要指定版本号。本地引入。居然没有npm安装,也是很奇特。因此,我采取了本地引入的方......
  • PostgreSQL技术大讲堂 - 第34讲:调优工具pgBagder部署
       PostgreSQL从小白到专家,是从入门逐渐能力提升的一个系列教程,内容包括对PG基础的认知、包括安装使用、包括角色权限、包括维护管理、、等内容,希望对热爱PG、学习PG的同学们有帮助,欢迎持续关注CUUGPG技术大讲堂。 第34讲:调优工具pgBagder部署 第34讲:11月18日(周六)......
  • Bagging
    Bagging(BootstrapAggregating)是一种集成学习方法,通过构建多个弱学习器,每个学习器使用不同的采样数据集,然后将它们的预测结果进行平均或投票来改善整体模型的泛化性能。这种方法的主要思想是通过对训练数据集的有放回随机采样来生成多个不同的训练子集,然后在每个子集上训练弱学习......
  • CF121E Lucky Array
    sqrttechnology,sqrtfaith.洛谷CF定义一个数为幸运数字,当且仅当其十进制数位中仅有\(4\)和\(7\)组成。给出长度为\(n\)的序列\(p_1\simp_n\),有\(q\)次操作,分为两种类型:\(\texttt{add}l\texttt{}r\texttt{}x\),将\(p_l\simp_r\)加上\(x\)。\(\te......
  • [POI2011] SMI-Garbage 题解
    题目链接显然,对于初始颜色与目标颜色不同的边,我们需要走过奇数次;对于初始颜色与目标颜色相同的边,我们需要走过偶数次。对于只有偶数边的情况,这种情况下不走就行;对于只有奇数边;可以理解为每条边只能经过一次,就是欧拉路径问题,并且考虑这题的特殊性质,如果一个图是由若干个简单环构......
  • MEASURES FOR GARBAGB DISPOSAL
    Tobeginwith,let'sreviewthedefinitionofwhatgarbagedisposalis.Thepurposeofgarbagedisposalistoremovethegarbagequickly,treatitharmlessly,andfinallyuseitreasonably.Thepurposeofgarbagedisposalisharmlessness,resourceand......