[AGC020-C] Median Sum

26 篇文章 0 订阅
19 篇文章 0 订阅
洛谷传送门
Atcoder传送门

题目大意

给你N个正整数 a1,a2,...,aN a 1 , a 2 , . . . , a N 。 考虑其非空子序列共有 2N1 2 N − 1 个, 其元素的和分别为 s1,s2,s3...s2N1 s 1 , s 2 , s 3 . . . s 2 N − 1 ,求 si s i 的中位数。

输入输出格式

输入格式

第一行为一个正整数 N N

接下来一行N个正整数, 表示 ai a i

输出格式

一行一个正整数, 表示 si s i 的中位数。

数据范围

  • 1N2000 1 ≤ N ≤ 2000
  • 1Ai2000 1 ≤ A i ≤ 2000

解题分析

一道简单的思维题。

如果算上空集的情况, 那么对于每个集合 Si S i ,都会有对应的包含另一半元素的 Si S i ′ 。 所以这个情况的中位数为 ai2 ∑ a i 2

那么去掉空集后答案显然会变大。 我们做一遍背包从 ai2 ∑ a i 2 向上取第一个即可。

O(N332) O ( N 3 32 ) 贼快…

代码如下:

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cctype>
#include <cmath>
#include <bitset>
#define R register
#define IN inline
#define gc getchar()
#define W while
#define MX 2018
template <class T>
IN void in(T &x)
{
    x = 0; R char c = gc;
    W (!isdigit(c)) c = gc;
    W (isdigit(c))
    x = (x << 1) + (x << 3) + c - 48, c = gc;
}
std::bitset <MX * MX> bt;//bitset大法好
int num, sum;
int main(void)
{
    bt[0] = true;
    int a;
    in(num);
    for (R int i = 1; i <= num; ++i)
    {
        in(a);
        bt |= bt << a, sum += a;
    }
    int mid = sum + 1 >> 1;
    for (R int i = mid; i <= sum; ++i)
    {
        if(bt[i]) printf("%d", i), exit(0);
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值