给你N个正整数 a1,a2,...,aN a 1 , a 2 , . . . , a N 。 考虑其非空子序列共有 2N−1 2 N − 1 个, 其元素的和分别为 s1,s2,s3...s2N−1 s 1 , s 2 , s 3 . . . s 2 N − 1 ,求 si s i 的中位数。
第一行为一个正整数 N N 。
接下来一行 N N 个正整数, 表示 ai a i 。
一行一个正整数, 表示 si s i 的中位数。
一道简单的思维题。
如果算上空集的情况, 那么对于每个集合 Si S i ,都会有对应的包含另一半元素的 S′i 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);
}
}