[AGC020-C] Median Sum

洛谷传送门

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 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 
#include 
#include 
#include 
#include 
#include 
#include 
#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  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);
    }
}

你可能感兴趣的:(数学,贪心,Atcoder)