首页 > 其他分享 >CF81C Average Score 题解

CF81C Average Score 题解

时间:2024-04-17 22:56:12浏览次数:23  
标签:num int 题解 Average id Score 序列 frac 放入

题目简述

给定一个长度为 $n$ 的序列,在其中取出 $x$ 个数,构成一个数列 $a$,剩下的 $y$ 个数构成数列 $b$。

若第 $i$ 个数在数列 $a$ 中,$ans_i$ 等于 $1$,否则等于 $2$,请你给出一种方案使得两数列的平均数之和最大且 $ans$ 的字典序最小.

题目分析

我们先考虑 $x=y$ 的情况,在这种情况下,对于第 $i$ 个数字,放入 $a$ 序列或者 $b$ 序列对答案的贡献都是一样的,由于字典序最小的要求,应优先将序号小的数放入 $a$ 序列中.

接下来考虑 $x$ 和 $y$ 不相等的情况,为了方便一些,我们令 $x \lt y$。对于一个数 $w$,它放入 $a$ 序列中对答案的贡献为 $\frac{w}{x}$,$b$ 序列中为 $\frac{w}{y}$,由于 $\frac{w}{y} \lt \frac{w}{x}$,所以它放入 $a$ 序列更优。

接下来,我们便有了贪心策略,将前 $x$ 大的数放入 $a$ 序列,剩余的放入 $b$ 序列,最后考虑一下字典序即可。

代码

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define random(a,b) (rand()%(b-a+1)+a)
const int N=1e5+1;
int n,x,y,T,ans[N];
struct Num
{
	int num,id;
}a[N];
bool cmp1(Num x,Num y)
{
	return x.num==y.num?x.id>y.id:x.num<y.num;
}
bool cmp2(Num x,Num y)
{
	return x.num==y.num?x.id<y.id:x.num<y.num;
}
int main()
{
	ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>x>>y;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].num;
		a[i].id=i;
	}
	if(x<y)
	{
		sort(a+1,a+1+n,cmp1);
		for(int i=1;i<=y;i++) ans[a[i].id]=2;
		for(int i=y+1;i<=n;i++) ans[a[i].id]=1;
	}
	else if(x==y)
	{
		for(int i=1;i<=x;i++) ans[i]=1;
		for(int i=x+1;i<=n;i++) ans[i]=2;
	}
	else
	{
		sort(a+1,a+1+n,cmp2);
		for(int i=1;i<=x;i++) ans[a[i].id]=1;
		for(int i=x+1;i<=n;i++) ans[a[i].id]=2;
	}
	for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	return 0;
}

标签:num,int,题解,Average,id,Score,序列,frac,放入
From: https://www.cnblogs.com/zhuluoan/p/18142002

相关文章

  • ICPC2023杭州站题解(B D E F G H J M)
    本场金牌数量较其他场多(45枚),但金牌线题数不多。五题为分水岭,五道简单题过后所有题均为金牌题,其中有四道可做,即ABEF,做出任意一道即可拿金牌。这里提供除A题以外的所有可做题的题解。ICPC2023杭州站:M:加入比当前选择的所有数大的数一定会让平均值上升,因此答案数列中,V图中的......
  • [题解][洛谷P1136] 迎接仪式
    题目描述对于一个由字母“j”和“z”组成的字符串,可以任意交换两个字符的位置不超过k次,求最多能出现多少个“jz”字串。题解动态规划题。设f[i][j][k][0/1]表示到第i位,前面交换了j个“j”,交换了k个“z”,且第i位是j(用0表示)或z(用1表示)。当j=k时即为可行解。为什么需要用第四维......
  • [题解][洛谷P1108] 低价购买
    题目描述求最长下降子序列长度,以及最长下降子序列的个数。(构成的序列一样的时候,视为同一种最长下降子序列)题解n不超过5000,n^2复杂度即可解决该问题。主要在于如何统计最长下降子序列个数。可以设数组t[i]表示以i为结尾的最长下降子序列个数,在更新f[i]的时候顺便更新。t[i]=......
  • [ABC229E] Graph Destruction 题解
    [ABC229E]GraphDestruction题解思路解析题目要求删点,而众所周知删点的代价要大于加点的代价,于是我们考虑倒着处理询问,将每一个删点改成加点,而加点时就用并查集维护连通块即可。code#include<bits/stdc++.h>usingnamespacestd;constintN=2e5+10;intn,m,fa[N];......
  • P10342 [THUSC 2019] 数列 题解
    形式化题面:求\[\sum_{l=1}^{n}\sum_{r=l}^{n}\max_{i=l}^{r}(i-l+1)\timesf(i,r)\]其中\(f(l,r)\)为\(a_l,...,a_r\)中有多少个不同的数字。注意到,除了Sub2,其余数据点都有\(\maxf\le800\),这启发我们考虑\(O(nm)\)的算法。套路地,扫描线枚举右端点,则现在只需要考虑......
  • [ABC212E] Safety Journey 题解
    [ABC212E]SafetyJourney题解思路解析首先根据题目的条件我们可以想到dp,用\(f_{i,j}\)表示走了\(i\)步,现在在\(j\)的方案数,可见转移即是\(f_{i,u}\gets\sum{f_{i-1,v}}\),这里的\(v\)表示每个与\(u\)相连的点。可见如此做时间复杂度为\(O(kn(\frac{n(n-1)}{2}-m......
  • ICPC2023南京站题解(A C D F G I L M)
    本场金牌线为7题前一半。做出8题可稳金牌,这里是难度前8题的题解。ICPC2023南京站I:签到题。#include<bits/stdc++.h>#definelllonglong#defineQWQcout<<"QwQ"<<endl;#defineFOR()llle=e[u].size();for(lli=0;i<le;i++)usingnamespacestd;constllN=501010;......
  • [ABC208D] Shortest Path Queries 2 题解
    [ABC208D]ShortestPathQueries2题解思路解析此题的本质其实就是Floyd。我们在进行Floyd时会有一个\(k\)充当中间点,可见这里的\(k\)就等于题目当中的\(k\),因为小于等于\(k\)的所有点都被当作过中间点转移过,而大于\(k\)的所有点都没有被当作过中间点转移过,于是直......
  • P3978 [TJOI2015] 概率论 题解
    题意:求一棵\(n\)个节点的有根二叉树的叶子节点的期望个数。设\(f_n\)表示\(n\)个点的二叉树个数,\(g_n\)表示\(n\)个点的所有二叉树的叶子节点数之和。显然\(f_n\)为\(\text{Catalan}\)数,考虑如何求\(g_n\)。一个结论是:\(g_n=f_{n-1}\timesn\)。证明:对于每一......
  • [题解][2021-2022年度国际大学生程序设计竞赛第10届陕西省程序设计竞赛] Cute Rabbit
    题目描述有n只兔子,每个兔子上有一个数ai。要将所有兔子分为白色和绿色两堆,使所有白色兔子的数对绿色兔子取余结果相等。求绿色兔子的最大数量。题解考虑一种情况:把所有除了最小值的数都涂为绿色,此时显然满足条件。对于一般情况:可以枚举白绿兔子的分割线x。对于小于x,试将其全......