首页 > 其他分享 >CF2023D Many Games

CF2023D Many Games

时间:2024-10-22 15:21:30浏览次数:6  
标签:frac CF2023D int Many sum db Games 100 include

题目大意

有\(n\)个二元组\((p_i,w_i)\),保证\(1\le p_i\le100,p_iw_i\le200000\),求一个集合\(S\),使得\(\prod_{i\in S}\frac{p_i}{100}\sum_{i\in S}w_i\)最大

\[n\le 200000 \]

题解

考虑一个极大的集合有什么样的性质,所谓极大就是不能够通过加入一个元素使得答案更大
设集合为\(S\),则不存在\(k\not\in S\),使得\(\sum_{i\in S}w_i\prod_{i\in S}\frac{p_i}{100}<(\sum_{i\in S}w_i+w_k)\prod_{i\in S}\frac{p_i}{100}\frac{p_k}{100}\)
作一些化简,得到\(\sum_{i\in S}w_i<\frac{p_kw_k}{100-p_k}\),此时加入\(k\)会使答案变大,反之使答案减小,那么可以观察到\(\sum_{i\in S}w_i\le \frac{99*w}{100-99}=200000\),也就是答案的集合的\(w\)和小于等于\(200000\),这样就可以想到使用背包解决,但复杂度依旧爆炸
可以按\(p\)分类每个二元组,然后按\(w\)从大到小排序,选择的集合显然是排序后的一个前缀,由前面推导的结论,如果选择放入第\(i\)个二元组,有一个必要条件\(\sum_{j=1}^{i-1}w_j<\frac{pw_i}{100-p}\),放缩一下\(iw_i<\frac{pw_i}{100-p}\),得到\(i<\frac{p}{100-p}\)
所以对于一个\(p\),最多只用做\(\lfloor\frac{p}{100-p}\rfloor\)次背包
\(p=1\sim 99\),得到运算次数约为\(400\)次,做\(400\)次背包,可以通过

代码

点击查看代码
#include<cstdio>
#include<vector>
#include<algorithm>
#define db double
using namespace std;
const int P=100,W=200000;
int n;
vector<int> w[P+10]; 
bool cmp(int a,int b){return a>b;}
db f[W+10];
void solve(int p,int w)
{
	for(int i=W;i>=w;i--)
		f[i]=max(f[i],f[i-w]*p/100);
}
int main()
{
	f[0]=1;
	scanf("%d",&n);
	for(int i=1,p,x;i<=n;i++)
	{
		scanf("%d %d",&p,&x);
		w[p].push_back(x);
	}
	for(int i=1;i<P;i++)
	{
		sort(w[i].begin(),w[i].end(),cmp);
		int resw=0;
		for(int j:w[i])
		{
			if(resw*(100-i)>=i*j)
				break;
			solve(i,j);
			resw+=j;
		}
	}
	db ans=0;
	int sumw=0;
	for(int j:w[P]) sumw+=j;
	for(int i=0;i<=W;i++)
		ans=max(ans,f[i]*(sumw+i));
	printf("%.8lf",ans);
	return 0;
} 

标签:frac,CF2023D,int,Many,sum,db,Games,100,include
From: https://www.cnblogs.com/the-blog-of-doctorZ/p/18492958

相关文章

  • CF2023D Many Games 题解
    赛时被创四了。思路考虑我们什么时候合并会比原来优。例如,我们现在要合并\(p_1,w_1\)和\(p_2,w_2\),同时保证,\(w_1\gew_2\)。那么有:\[\frac{p_1}{100}\timesw_1\le\frac{p_1}{100}\times\frac{p_2}{100}\times(w_1+w_2)\]\[\frac{p_2}{100}\timesw_2\le\frac{p_1}{......
  • CF2023 - D. Many Games
    先让\(p\)除以\(100\),相当于给你两个数组\(p,w\),然后要选择下标集合\(S\),使得:\(p\)的积乘上\(w\)的和最大化。注意到\(p_i\)是整数,并且\(1\lep_i\le100\)。那么容易想按照\(p_i\)分类。然后\(w_i\)对于固定\(p\)一定是选择排序后的最大值后缀。目前\((......
  • Educational Codeforces Round 170 (Rated for Div. 2) C. New Games
    题意转化找一些相邻的数(其中相邻定义为递增序下任意相邻两数差\(\leq1\))求相邻数中,不同数字有\(k\)种,取到数字个数的最大值算法容易想到按顺序排列观察到有点像滑动窗口,考虑用队列维护一个出现不同数字次数为\(k\)的区间,再计算代码来自转载地址voidsolv......
  • GAMES101(作业7)
     作业七题目:实现pathTracing,仅修改castRay(constRayray,intdepth)函数,在其中实现PathTracing算法代码框架://OBJ-loader模型加载库 global:全局变量/函数 vector:Vector3f,Vector2f类floatnorm(){returnstd::sqrt(x*x+y*y+z*z);}/*向量长度......
  • Too many / Not enough values in OpenAI Gym Mario Model for Reinforcement Learnin
    题意:在OpenAI Gym的马里奥兄弟(Mario)模型中,对于强化学习来说,存在“值太多”或“值不够”的问题问题背景:ReinforcementlearningusingOpenAIGymhastheabilitytomakeareinforcementmodelforplayingSuperMarioBros.ItrieddoingthisfollowingNicholasRe......
  • Codeforces Round 959 (Div. 1 + Div. 2) C. Hungry Games题解
    CodeforcesRound959(Div.1+Div.2)C.HungryGames题解题目链接大致题意:给定一个长度为n的数组,并且给出一对l,r表示一个区间,如果∑i......
  • ARC073F Many Moves
    当你填表法推了半年没推出来,为什么不试试刷表法呢?洛谷传送门在一行中有$n$个格子,从左往右编号为\(1\)到\(n\)。有\(2\)颗棋子,一开始分别位于位置\(A\)和\(B\)。按顺序给出\(Q\)个要求,每个要求是如下形式:给出一个位置\(x_i\),要求将两个棋子中任意一个移动到位置\(x......
  • Laravel Blade:如何在表循环中迭代模型的belongsToMany关系?
    一、引言(一)介绍是一种流行的PHP模板引擎,用于构建动态网页。在本文中,我们将探讨如何在表循环中迭代模型的belongsToMany关系。通过使用LaravelBlade,我们可以轻松地处理这种复杂的关系,并在模板中显示相关的数据。本文将介绍如何设置关系、如何在模板中访问关系数据以及如何使用......
  • 游戏创作的梦想之地!EE GAMES 创作者社区上线,VipSkill产学研结合迈开重大步伐
    EEGAMES官网EEGAMES创作者社区是一个怎样的平台?EEGAMES创作者社区,是专注于链接每一位游戏创作者,提供全方位服务的游戏领域垂类社区。这里不仅仅是一个游戏创作的互助平台,更是每一位游戏创作者的梦想启航之地!无论你是经验丰富的游戏研发行家,还是刚刚起步的业内新人,都可......
  • BUG: pymysql executemany不支持insert on duplicate key update
    pymysql的executemany()方法支持传入单个SQL和一个sequenceofrecords(sequenceormapping)来同时写入多条数据。例如:sql="insertintot(c1,c2)values(%s,%s)"args=[(1,2),(3,4)]cursor.executemany(sql,args)#Ifargsisalistortuple,%scanbeusedas......