首页 > 其他分享 >SS241012B. 电梯(lift)

SS241012B. 电梯(lift)

时间:2024-10-11 20:11:20浏览次数:1  
标签:int read 电梯 lift SS241012B 物品 fi vec define

SS241012B. 电梯(lift)

题意

你有 \(n\) 种货物,每种货物有一个高度 \(f\) 和体积 \(w\)。其中 \(w\) 表示体积是 \(2^w\)。你有一个大小为 \(2^m\) 的背包,一个背包的花费是背包物品的最大高度,问使用若干个背包装完物品的最小代价。

思路

膜拜黄队%%%感觉黄队的做法比题解好。

首先一个贪心是如果你已经放入了一个高的物品,剩下的空间你一定想尽量放入一个高度差不多的物品,而不是一个超级矮的物品。因此按高度从大到小枚举物品来做。

部分分数的一个做法是,从高到矮枚举物品,每次放能放下的最高的物品。由于物品体积都是 \(2\) 的幂,贪心正确。

考虑体积为 \(0\) 的物品,两个 \(0\) 会占掉 \(1\) 的空间。如果不使用体积为 \(0\) 的物品,最小能多出来的空间一定是大小为 \(1\),然后就可以塞 \(2\) 个 \(0\) 进去,因此我们可以把大小为 \(0\) 的东西两两捆在一起。根据贪心,最高的和第二高的捆在一起,以此类推。如果最后剩下 \(1\) 个 \(0\),它就自己变成一捆,大小改成 \(1\),因为多出来的 \(0\) 的空间已经没有用了,放不下任何东西。然后我们考虑若干个大小为 \(1\) 的物品,由于一样的原因,可以把它们两两捆在一起。最后捆成若干捆大小为 \(m\) 的东西,然后就可以计算代价了。

复杂度 \(O(n \log n)\)。因为两个东西捆成一个,所以只会捆 \(O(n)\) 次。复杂度瓶颈在于排序。

code

荣获第二劣解

#include<bits/stdc++.h>
// #define LOCAL
#define sf scanf
#define pf printf
#define rep(x,y,z) for(int x=y;x<=z;x++)
#define per(x,y,z) for(int x=y;x>=z;x--)
using namespace std;
typedef long long ll;
const int N=5e5+7;
#define isdigit(x) (x>='0'&&x<='9')
template <typename T>
void read(T &x) {
	x=0;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar());
	for(;isdigit(ch);ch=getchar()) x=(x<<3)+(x<<1)+ch-'0';
}
template <typename T>
void write(T x) {
	static int st[10];
	int top=0;
	do {
		st[top++]=x%10;
		x/=10;
	}while(x);
	while(top) putchar(st[--top]+'0');
}
int n,m;
ll ans;
int c,w,f;
typedef pair<int,int> pii;
#define fi first
#define se second
vector<pii > vec[N];
bool cmp (pii a,pii b) { return a.se > b.se; }
int main() {
	#ifdef LOCAL
	freopen("in.txt","r",stdin);
	freopen("my.out","w",stdout);
	#else
	freopen("lift.in","r",stdin);
	freopen("lift.out","w",stdout);
	#endif
	read(n),read(m);
	rep(i,1,n) {
		read(c),read(w),read(f);
		vec[w].push_back({c,f});
	}
	rep(i,0,m-1) {
		sort(vec[i].begin(),vec[i].end(),cmp);
		bool fl=0;
		for(auto u: vec[i]) {
			if(fl) u.fi--;
			fl=0;
			if(u.fi==0) continue;
			vec[i+1].push_back({((u.fi+1)>>1),u.se});
			if(u.fi&1) fl=1; 
		}
	}
	for(auto u:vec[m]) ans+=1ll*u.fi*u.se;
	write(ans);
}

标签:int,read,电梯,lift,SS241012B,物品,fi,vec,define
From: https://www.cnblogs.com/liyixin0514/p/18459187

相关文章

  • P8392 [BalticOI 2022 Day1] Uplifting Excursion(特殊背包问题)
    题意简述有\(2m+1\)种物品,体积分别为\(-m\simm\),每种物品有\(a_i\)个。你需要选出尽可能多数量的物品,使得物品体积和为\(l\)。\(m\le300,a_i,|l|\le10^{18}\)分析此题属于“背包容量极大,物品体积极小”的特殊背包问题。考虑背包问题的经典错误贪心:按照性价比降序排......
  • 基于并发电梯多媒体
     功能实现伪代码//大家可以参考一下大致实现过程intfloor_num[10]={0};//0表示楼层按键熄灭,1表示楼层按键点亮,10个元素对应10层楼intcuccent_floor=1;//当前楼层,默认在1楼intfloor_flag=0;  //电梯运行标记 0表示停止,1表示向上,-1表示向下inth_num=0......
  • Liftoff:基于参考基因组的基因组注释
    Liftoff是一个可以准确根据同一物种或近缘物种基因组进行基因注释映射的工具(与liftOver进行不同基因组版本的染色体位置转换有点类似)。该工具仅需两个基因组序列和参考基因组的基因注释文件即可进行基因注释。Liftoff使用minimap2将参考基因组的基因序列与目标基因组比对,这样的好......
  • 南沙C++noip老师解一本通题: 1360:奇怪的电梯(lift)
    ​【题目描述】大楼的每一层楼都可以停电梯,而且第i层楼(1≤i≤N)上有一个数字Ki(0≤=Ki≤=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:33125代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4......
  • Liftoff:基于参考基因组的基因组注释
    Liftoff是一个可以准确根据同一物种或近缘物种基因组进行基因注释映射的工具(与liftOver进行不同基因组版本的染色体位置转换有点类似)。该工具仅需两个基因组序列和参考基因组的基因注释文件即可进行基因注释。Liftoff使用minimap2将参考基因组的基因序列与目标基因组比对,这样的......
  • 轿厢电梯-电动车检测数据集(真实电梯监控)
    轿厢电动车检测数据集,可做电梯乘客、电动车检测任务。数据集由真实电梯监控图片(大约四千)、电动车网图、手机拍摄图片构成,总计14000张左右,其中近8000样本已标注。注:文件夹后面数字为对应数据集样本数量,“未标注”的则表示该数据集未标注(只有图片)数据集名称:轿厢电动车检测......
  • python电梯厂企业固定资产管理系统excel数据导入 9327d
    目录博主介绍技术栈......
  • 命令模式的实际应用案例:从电梯控制系统到文本编辑器
    命令模式的实际应用案例:从电梯控制系统到文本编辑器引言设计模式是软件工程中解决特定问题的经典方案,它们提供了灵活、可扩展的代码结构,能够在应对复杂系统设计时发挥重要作用。命令模式(CommandPattern)作为行为型设计模式之一,通过将请求封装为对象,使得请求的调用者与执行......
  • Java行为型设计模式-状态模式(含电梯场景示例)
    1.状态模式简介状态模式(StatePattern)是一种行为型设计模式,它允许一个对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。状态模式的目的是让状态转换显式,并且使得状态转换代码集中在一个地方,不需要使用多重条件语句。状态模式(StatePattern)用于解决系统中对......
  • 基于yolov10的电梯电瓶车、电动车检测系统,支持图像检测,也支持视频和摄像实时检测(pytor
       更多目标检测和图像分类识别项目可看我主页其他文章功能演示:基于yolov10的电梯电瓶车,电动车检测,支持图像、视频和摄像实时检测【pytorch框架、python】_哔哩哔哩_bilibili(一)简介基于yolov10的电梯电瓶车、电动车检测系统是在pytorch框架下实现的,这是一个完整的项目,包......