首页 > 其他分享 >Codeforces Round 684 (Div. 2) B. Sum of Medians

Codeforces Round 684 (Div. 2) B. Sum of Medians

时间:2023-10-13 17:25:57浏览次数:41  
标签:lfloor std frac Medians Codeforces rfloor 中位数 数组 Round

定义 \(median\) 是一个非降序数组中第 \(\lceil \frac{n}{2} \rceil\) 的数。数组从 \(1\) 开始标号。

给两个数 \(n\) 和 \(k\) ,并给出一个长为 \(nk\) 的数组 \(a\) 。

需要分出为 \(k\) 个大小为 \(n\) 的数组,每个元素需要被严格分入一个数组中。

需要让 \(k\) 个数组的中位数之和最大。询问最大值是多少。

定理:一个数组 \(a\) 中抽出 \(n\) 个数,最大的 \(\lfloor \frac{n}{2} \rfloor\) 不可能为这 \(n\) 个数的中位数。

当需要从大数组 \(a\) 中分出一个大小为 \(n\) 的小数组时,显然 \(a\) 中最大的 \(\lfloor \frac{n}{2} \rfloor\) 个元素不可能是中位数,于是可以让第 \(\lfloor \frac{n}{2} \rfloor - 1\) 大的元素作为当前的中位数。然后从 \(a\) 中抽去最大的 \(\lfloor \frac{n}{2} \rfloor + 1\) 个数,再抽去最小的 \(n - (\lfloor \frac{n}{2} \rfloor + 1)\) 个最小数即可。

上述过程可使当前选出的大小为 \(n\) 的数组中位数最大。

容易证明可以根据上述算法贪心:

  • \(a\) 最大的 \(\lfloor \frac{n}{2} \rfloor\) 个数不可能为任何一个大小为 \(n\) 的数组的中位数。
  • 抽取最小的 \(n - (\lfloor \frac{n}{2} \rfloor + 1)\) 不会使任何一个数组的中位数更小。
  • 第 \(\lfloor \frac{n}{2} \rfloor - 1\) 大的数不会影响后面的中位数。

得证当前的贪心不会对后面的最优化造成影响。于是全局可以贪心。

view
#include <bits/stdc++.h>
typedef long long ll;
void solve(){
	int n, k; std::cin >> n >> k;
	std::vector<int> a(n * k + 1);
	for (int i = 1; i <= n * k; i++) std::cin >> a[i];
	std::sort(a.begin() + 1, a.end());
	int x = n / 2, r = n * k, l = 1;
	ll ans = 0;
	while (r - l + 1 >= n) {
		ans += a[r - x];
		r -= x + 1;
		l += n - (x + 1);
	}
	std::cout << ans << "\n";
}
int main() {
	int _ = 1; std::cin >> _;
	while (_--) {solve();}
	return 0;
}

标签:lfloor,std,frac,Medians,Codeforces,rfloor,中位数,数组,Round
From: https://www.cnblogs.com/zsxuan/p/17762601.html

相关文章

  • Codeforces Round 685 (Div. 2) B. Non-Substring Subsequence
    对于一个长为\(n\)的\(01\)字符串\(s\)有\(n\)个询问。第\(i\)个询问被\(l_i,r_i\)描述\(1\leql_i<r_i\leqn\)。对于每个询问,你需要确定\(s\)中是否存在一个子序列等同于子串\(s[l_i\cdotsr_i]\)。显然子序列可以和子串仅有一个字符不相同。于是\(s......
  • Codeforces Round 690 (Div. 3) C. Unique Number
    给一个正整数\(x\),需要构造一个最小的正整数\(n\)使得\(\sumdigt(n)=x\),并且\(\foralli\neqj,digt(n)_i\neqdigt(n)_j\)。首先观察到\(0\)没有贡献,且会增加位数,所以不能有\(0\)。由于每个数位只能出现一次,显然合法的\(x\)范围为\([0,\sum_{i=1}^{9}i]......
  • Codeforces Round 695 (Div. 2) A. Wizard of Orz
    有\(n\)个数位板摆放成一条直线,每个数位板可以显示\(0\sim9\)的数字。最开始数位板显示的是\(0\)。每秒数位板上的数字都会加\(1\),\(9\)的下一个数字是\(0\)。当一个数位板被暂停,它上面的数字将会定格在当前秒。你必须对某个数位板执行一次暂停,在任意可选的时刻。......
  • Educational Codeforces Round 156 (Rated for Div. 2) A-E
    A题签到题分余1余2余0讨论 #include<bits/stdc++.h>usingnamespacestd;#definemaxn400100#defineintlonglongintread(){intans=0,f=1;charch=getchar();while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}......
  • 【牛客周赛】round14赛后总结
    碎碎念赛时没出题(真可恶吖)在上晚自习,补了一下。ACD都套着字符串的外壳,差点直接劝退,后来仔细一读发现和字符串没什么关系...大概字符串的用处是为了劝退我这种有些怂字符串的人叭。A.小红的环形字符串题意:对于给定的环形字符串s,可以删除相邻的两个相同字母,问最多删除多少个字......
  • Codeforces Round 694 (Div. 2) A. Strange Partition
    给一个长为\(n\)的数组\(a\)和一个正整数\(x\)。你可以执行以下操作任意次:用两个相邻元素的和替换这两个元素。如\([\cdots,a_i,a_{i+1},\cdots]\rightarrow[\cdots,a_i+a_{i+1},\cdots]\)。一个数组\(b=[b_1,\cdots,b_k]\)的美丽值定义为\(\sum_{i=1}^{k}......
  • Codeforces Round 697 (Div. 3) A. Odd Divisor
    给一个正整数\(n\),判断\(n\)是否存在一个\(>1\)的奇数因子。只要\(n\)的唯一分解下存在除\(2\)以外的质因子,则\(n\)存在\(>1\)的奇数因子。于是\(n\neqlowbit(n)\)则\(n\)存在奇数因子。(应用了\(2^k=lowbit(2^k)\)的性质)view#include<bits/stdc+......
  • Codeforces Round 703 (Div. 2) A. Shifting Stacks
    给定\(n\)个石堆,第\(i\)个石堆高为\(h_i\)并且代表这堆石块的个数。在一次操作中你可以将第\(i\)堆中的一块石块移动(需要存在石块)到\(i+1\)堆。询问是否可以使石堆的高度严格递增。显然贪心地让第\(1\)堆的高度为\(0\)。然后线性模拟使得第\(1\simn-1\)的......
  • Codeforces Round 899 (Div. 2)
    目录写在前面ABCDE1E2写在最后写在前面比赛地址:https://codeforces.com/contest/1882。你知道我要在这里放一首由日本女歌手演唱的歌曲:一个队友去医院一个队友军训,堂堂单刷!感觉开场5h太浪费了于是找了场div2,然后C不会做卡了1h,妈的。看完题解立马会了,我果然是没脑子选......
  • CodeForces 1882E2 Two Permutations (Hard Version)
    洛谷传送门CF传送门如何评价,模拟赛搬了一道,前一天晚上代码写了一半的题。考虑如何让操作次数最小。发现直接做太困难了。根本原因是,一次操作对序列的影响太大了。考虑做一些转化,减少一次操作对序列的影响。仍然先考虑一个排列怎么做。不知道为什么可以想到在排列前面添加特......