首页 > 其他分享 >Luogu P10010 Grievous Lady

Luogu P10010 Grievous Lady

时间:2024-08-18 09:38:29浏览次数:7  
标签:cys return P10010 Luogu dfs 断点 int step Lady

很水的一道黑

传送门

题目大意

给出 \(n\) 个元素,每个元素有两个权值 \(a_i\) 和 \(b_i\),从中选出若干元素,

令取出元素的 \(a_i\) 之和为 \(S_a\) ,其余元素的 \(b_i\) 之和为 \(S_b\) ,最大化 \(S_a*S_b\)

分析

可以知道 \(a_i\) , \(b_i\) 的值分别在 \([1,A]\) , \([1,B]\) 间均匀随机生成;

所以 \(a_i\) , \(b_i\) 之和相差并不大,贪心选更大的即可得出最优解;

可以按 \(\frac{a_i}{b_i}\) 排好序后在中点附近枚举断点,差不多枚举 \(100\) 个即可;

最后断点左边都选 \(b_i\) ,右边都选 \(a_i\),得出的结果取 \(max\) ,记得开 \(int\underline{\;\;}128\);

优化

但是当 \(a_i\) , \(b_i\) 本身相差很小甚至相等时,按如上方法求解很容易举出反例

所以每个断点附近还要进行几次暴搜来保证正确性(实测搜 \(10\) 个即可)

代码

#include <bits/stdc++.h>
#define cys __int128
using namespace std;
const int maxn=3009;
int T,n;
long long A,B;
cys ans,l,r;
struct node{
	cys a,b;
}s[maxn];
inline cys read(){
	cys res=0;char c=getchar();
	for(;c<'0'||c>'9';c=getchar());
	for(;c>='0'&&c<='9';c=getchar()) res=(res<<3)+(res<<1)+(c^48);
	return res;
}
void write(cys x){
	if(x>9) write(x/10);
	putchar(x%10+'0');
}
bool cmp(node x,node y){return 1.0*x.a/x.b>1.0*y.a/y.b;}
cys dfs(int step,cys X,cys Y){
	if(step==r+1) return X*Y;
	return max(dfs(step+1,X+s[step].a,Y),dfs(step+1,X,Y+s[step].b));
}
int main(){
	scanf("%d%d%lld%lld",&T,&n,&A,&B);
	while(T--){
		for(int i=1;i<=n;i++) s[i].a=read(),s[i].b=read();
		sort(s+1,s+n+1,cmp);ans=0;
		for(int k=max(1,n/2-50);k<=min(n,n/2+50);k++){
			cys x=0,y=0;
			l=max(1,k-5),r=min(n,k+5);
			for(int i=1;i<l;i++) x+=s[i].a;
			for(int i=r+1;i<=n;i++) y+=s[i].b;
			ans=max(ans,dfs(l,x,y));
		}
		write(ans),puts("");
	}
	return 0;
}

那么多随机算法标签结果只有数据是随机的

标签:cys,return,P10010,Luogu,dfs,断点,int,step,Lady
From: https://www.cnblogs.com/hypixel/p/18365306

相关文章

  • 【网络流模板题 EK增广路】luogu P2740 [USACO4.2] 草地排水Drainage Ditches)
    [P2740USACO4.2]草地排水DrainageDitches)大意:网络流模板做法:EK增广路#include<cstdio>#include<queue>#include<deque>#include<stack>#include<map>#include<cmath>#include<algorithm>#include<iostream>#include......
  • [lnsyoj3174/luoguP4823/TJOI2013]拯救小矮人
    题意给定序列\(a,b\)和常数\(h\),若序列中存在值\(k\)满足\(b_k+\sum_{i=1}^{\operatorname{len}(a)}a_i\geh\),则可将\(a_k,b_k\)删除,求从\(a\)中删除的数的数量最大为多少。sol由于\(b\)越小的数越靠后越难被删除,同时,\(a\)越大的数越可以帮助其他数字被删除,因......
  • [lnsyoj2271/luoguP3745/省选联考 2017]期末考试
    题意给定长度为\(n\)的序列\(t\)和长度为\(m\)的序列\(b\),以及常数\(A,B,C\),可以进行两种操作:选取任意\(1\lex,y\len\),并使\(b_x+1,b_y-1\),记进行了\(\alpha\)次这种操作;选取任意\(1\lez\len\),并使\(b_z-1\),记进行了\(\beta\)次这种操作。求进......
  • [lnsyoj4029/luoguP4109/HEOI2015]定价
    题意记\(x'\)为\(x\)去除后导零的值,则定义\(f(x)=2(\lfloor\log_{10}x'\rfloor+1)-[x'\equiv5\pmod{10}]\),给定区间\([L,R]\),求该区间中最小的\(f(x)\)值。sol一道贪心题,思想比较好想,我们需要使得前面的非0数字部分长度最小,且末尾尽可能为\(5\)。具体实现中,我......
  • [lnsyoj4079/luoguP6899]Pachinko
    题意一个包括空地、障碍和空洞的\(H\timesW\)地图,从第一列随机选取空地作为起始位置,到达某个空洞后停止运动。给定向上下左右移动的概率比\(p_u:p_d:p_l:p_r\),求在每个空洞停止运动的概率为多少。sol由于每次到达空洞后即会停止运动,因此到达空洞的期望次数即为到达每个空洞......
  • luogu 数据生成
    luogu数据生成利器testtest.exe是指标准程序,不能出错。一般把gen和test放在一起。示例test。#include<bits/stdc++.h>usingnamespacestd;intmain(){inta,b;cin>>a>>b;cout<<a+b;return0;}数据生成先贴代码:#include<bits/stdc++.h>......
  • [lnsyoj2246/luoguCF979D]Kuro and GCD and XOR and SUM
    题意给定集合\(S\),初始为空,进行\(q\)次修改或查询操作:修改操作将\(x\)加入集合;查询操作给定\(x,s,k\),要求找到满足\[\max_{u\inS,u+x\les,k|\gcd(u,x)}\{u\oplusx\}\]的最小的\(u\)。sol集合、异或、可查可改,可以自然地想到0/1-Trie。我们假设\(k=1\),此时不需......
  • luogu题解:P10456 The Pilots Brothers' refrigerator【缺少 SPJ】
    思路此题题意酷似P10449.费解的开关。https://www.luogu.com.cn/problem/P10449不同之处便是状态连锁改变不同,但做法截然不同,此题是一个\(4\times4\)的矩阵。暴力枚举的复杂度是\(O(10^7)\),即\(2^{16}\times16\times16=16777216\),\(10^7\)的复杂度可以通......
  • [lnsyoj2073/luogu5911]PRZ
    题意给定由\(n\)个二元组\((t,w)\)组成的集合\(S\)和常数\(W\),需要将\(S\)分为任意多个非空子集\(sub_1,sub_2,\cdots,sub_k\),求:\[\min\{\sum_{i=1}^k\max_{j\insub_i}\{t_j\}(\sum_{j\insub_i}w_j\leW)\}\]sol数据范围较小,显然状态压缩DP。状态比较好想,\(f_......
  • [lnsyoj70E/luoguCF70E]Information Reform
    题意给定常数\(k\),一棵\(n\)节点的树和序列\(d\)(\(d\)单调不降),选定一些点为关键点。设关键点的个数为\(cnt\),集合为\(S\),求\[\min\{k\cdotcnt\cdot\sum_{i=1}^n\max_{j\inS}\{d_{dist_{i,j}}\}\}\]sol显然树形DP。由于\(d\)单调不降,因此每个点一定会尽可能选择......