首页 > 其他分享 >珠宝 (01背包,四边形不等式)

珠宝 (01背包,四边形不等式)

时间:2024-04-30 14:56:01浏览次数:23  
标签:01 不等式 int ll mid pos 背包 四边形 define

\(01\) 背包的 trick。

Link.

做法 \(1\)

暴力背包。超时。

做法 \(2\)

一个显然的性质就是,按 \(c_i\) 归类,先用价值大的。

如果无法更新背包,直接退出循环即可。

亲测能获得 85pts 的好成绩。

时间复杂度同暴力背包。(理论)

做法 \(3\)

如果你认真打了表,会发现如果从大往小放,那么最后一个更新的点是在递增的。

这一个很好理解,更新点只会右移。

加上这个小优化,虽然理论复杂度和暴力没区别,但是就是能草过去。

点击查看代码
#include<bits/stdc++.h>
#define N 50005
#define M 305
#define ll long long
#define reg register
using namespace std;
int n,m;
ll f[N];
vector <int>E[M];
inline int read()
{
	int s=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9')
	{
		s=(s<<3)+(s<<1)+c-'0';
		c=getchar();
	}
	return s;
}
int main()
{
//	freopen("a1.in","r",stdin);
	n=read(),m=read();
	for(reg int i=1;i<=n;i++)
	{
		int c,v;
		c=read(),v=read();
		E[c].push_back(v);
	}
	for(reg int i=1;i<=M-5;i++)
	{
		if(E[i].empty()) continue;
		sort(E[i].begin(),E[i].end());
		int used=1,pos=i;
		for(reg int k=E[i].size()-1;k>=0;k--)
		{
			int now=E[i][k];
			used=0;
			for(reg int j=m;j>=pos;j--)
				if(f[j]<f[j-i]+now) f[j]=f[j-i]+now,used=j;
			pos=used;
			if(!used) break;
		}
	}
	for(int i=1;i<=m;i++) printf("%lld ",f[i]);
	return 0;
}

做法 \(4\)

所以在同一纬度内有决策单调性。

我们定义 \(f_{i,j}\) 表示第 \(i\) 类物品花 \(j\) 元的最大价值。

所以转移方程是 \(f_{i,j}=\min f_{i-1,j-kc}+w(k)\)

按 \(k\) 分类转移即可。

时间复杂度 \(O(Cm\log m)\)。

#include<bits/stdc++.h>
#define N 50005
#define M 305
#define K 1000005
#define ll long long
#define reg register
using namespace std;
int n,m;
ll f[N],g[N];
vector <ll>E[M];
inline int read()
{
	int s=0;
	char c=getchar();
	while(c<'0'||c>'9') c=getchar();
	while(c>='0'&&c<='9')
	{
		s=(s<<3)+(s<<1)+c-'0';
		c=getchar();
	}
	return s;
}
ll sum[K];
void solve(int l,int r,int ql,int qr,int k,int cur)
{
	if(l>r||ql>qr) return;
	int mid=(l+r)/2*k+cur;
	ll maxx=-1;
	int pos=1145141919;
	for(int i=ql;i<=min(mid,qr);i+=k)
		if(g[i]+sum[(mid-i)/k]>maxx) maxx=g[i]+sum[(mid-i)/k],pos=i;
	f[mid]=maxx;
	mid=(l+r)/2;
	solve(l,mid-1,ql,pos,k,cur);
	solve(mid+1,r,pos,qr,k,cur);
}
int main()
{
	n=read(),m=read();
	for(reg int i=1;i<=n;i++)
	{
		int c,v;
		c=read(),v=read();
		E[c].push_back(v);
	}
	for(reg int i=1;i<=M-5;i++)
	{
		if(E[i].empty()) continue;
		sort(E[i].begin(),E[i].end());
		int len=E[i].size();
		memset(sum,0,sizeof sum);
		for(reg int k=1;k<=min(len,m);k++)
			sum[k]=sum[k-1]+1ll*E[i][len-k];
		for(int i=len+1;i<=m;i++) sum[i]=sum[i-1];
		memcpy(g,f,sizeof g);
		for(int k=0;k<i;k++)
		{
			int R=(m/i)*i+k;
			if(R>m) R-=i;
			solve(0,(R-k)/i,k,R,i,k);
		}
	}
	for(int i=1;i<=m;i++) printf("%lld ",f[i]);
	return 0;
}

标签:01,不等式,int,ll,mid,pos,背包,四边形,define
From: https://www.cnblogs.com/g1ove/p/18168016

相关文章

  • 集成了高压初级侧开关,INN3649C-H606-TL、INN3678C-H606-TL、INN3676C-H601-TL 离线转
    1、详情InnoSwitch3-EP系列IC可极大简化低压大电流电源的开发和制造,尤其是那些采用紧凑外壳或需要满足高效率要求的电源。InnoSwitch的架构极具革新性,因为该器件同时将初级和次级控制器以及检测元件和符合安全标准的反馈机制集成到了单个IC中。装置整合了多种保护功能,包括线电压......
  • 这种运行结果里的10.100000001,怎么能最快改成10.1?
    大家好,我是Python进阶者。一、前言前几天在Python白银交流群【无敌劈叉小狗】问了一个Python基础的问题。问题如下:这种运行结果里的10.100000001,怎么能最快改成10.1,所有结果都最多一位小数。二、实现过程这里【论草莓如何成为冻干莓】和【.】给了一个指导:用round函数或者’%.......
  • go学习01
    加载网页文件夹和加载静态资源文件路径:<linkrel="stylesheet"href="/static/css/style.css"><scriptsrc="/static/js/common.js"></script>//加载网页文件夹ginServer.LoadHTMLGlob("templates/*")//加载静态资源......
  • Spring WebFlow 远程代码执行漏洞(CVE-2017-4971)
    SpringWebFlow远程代码执行漏洞(CVE-2017-4971)SpringWebFlow是一个适用于开发基于流程的应用程序的框架(如购物逻辑),可以将流程的定义和实现流程行为的类和视图分离开来。在其2.4.x版本中,如果我们控制了数据绑定时的field,将导致一个SpEL表达式注入漏洞,最终造成任意命令执行。......
  • Qt Creator + MSVC2017编译器配置指南
    QtCreator+MSVC2017编译器配置指南下载和安装MSVC2017编译器下载下载MSVC编译器安装工具:https://docs.microsoft.com/zh-tw/previous-versions/visualstudio/visual-studio-2017/install/use-command-line-parameters-to-install-visual-studio?view=vs-2017安装安......
  • 初中中考阅读理解难题一网打尽!句子结构深度解析+答案揭秘,助你轻松冲刺高分!-014
    PDF格式公众号回复关键字:ZKYDT014原文1DoChineseyoungpeopleliketowatchshowsonmobilephoneswhileeating?解析1Do助动词,Chineseyoungpeople中国年轻人,liketo喜欢,watchshowsonmobilephones看手机上节目,whileeating?吃饭的时候中国年轻人......
  • 从零手写实现 apache Tomcat-01-入门介绍
    创作缘由平时使用tomcat等web服务器不可谓不多,但是一直一知半解。于是想着自己实现一个简单版本,学习一下tomcat的精髓。怎么实现一个tomcat呢?Tomcat就像是一个用Java语言搭起来的大舞台,专门用来演出那些用Java编写的网页剧。想要玩得转Tomcat,你最好对Java语言有所了解......
  • 设计模式01 -----单例模式
    单例模式是一种常见的设计模式,用于确保类只有一个实例,并提供一个全局访问点。这种模式通常用于管理共享资源,例如数据库连接、日志文件等。单例模式的主要特点包括:单一实例:该模式确保类只有一个实例存在,无论何时何地都可以访问到这个实例。全局访问点:单例模式提供了一个全局......
  • 启发式评估(Heuristic Evaluation)--转载 [2011.12.13 sina blog]
    启发式评估(HeuristicEvaluation) -[一架好书--读书学习的收获]2008年08月07日分类: 一架好书--读书学习的收获  版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明http://buyantang.blogbus.com/logs/27286224.htmlUsabilityInspectionMethods,Edit......
  • 启发式评估(heuristic evaluation)方法介绍--转[2011.12.23 sina blog]
    启发式评估(heuristicevaluation)方法介绍(2008-09-0911:56:52)转载▼标签:it分类: 2互联网产品设计什么是启发式评估?启发式评估法就是使用一套简单、通用、有启发性的可用性原则来进行的可用性评估。即几个评审人员根据一些通用的可用性原则和自己的经验来发现......