ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【学习笔记】CF3B Lorry 题解

2021-10-23 09:32:47  阅读:169  来源: 互联网

标签:1919810 题解 ll nu num ans include CF3B Lorry


题目传送门

正解

思路

  • 因为物品的重量只有 1 和 2,所以考虑暴力枚举选择多少个 2 ,剩下的尽可能多地填充 1 即可。

  • 为什么“尽可能多”正确呢?很显然,这是因为物品的价值 \(\ge 1\) 。

  • 至于怎么选择,只需要将物品的价值从大到小排序,然后取靠前的即可。

  • 注意使用前缀和优化。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll n,v;
struct num{
	ll nu,po;
}j[100233],o[100233];
ll cj,co,qj,qo,t,w,ans=-1919810,rere=-1919810;
inline bool cmp(num a,num b){
	return ((a.nu>b.nu)?true:((a.nu==b.nu)?a.po<=b.po:false));
}
int main(){
	scanf("%lld%lld",&n,&v);
	for(int i=1;i<=n;++i){
		scanf("%lld%lld",&t,&w);
		if(t==1){j[++cj].nu=w;j[cj].po=i;}
		else{o[++co].nu=w;o[co].po=i;}
	}
	sort(j+1,j+cj+1,cmp);
	sort(o+1,o+co+1,cmp);
	ll fff=max(cj,co);
	for(int i=1;i<=fff;++i){
		j[i].nu+=j[i-1].nu;
		o[i].nu+=o[i-1].nu;
	}
	for(int i=0;i<=co;++i){
		if((i<<1)>v) break;
		ll ott=min(v-(i<<1),cj);
		rere=o[i].nu+j[ott].nu;
		if(rere>ans){ans=rere;qj=ott;qo=i;}
	}
	printf("%lld\n",ans);
	for(int i=1;i<=qj;++i)
		printf("%lld ",j[i].po);
	for(int i=1;i<=qo;++i)
		printf("%lld ",o[i].po);
	return 0;
}
/*
8 1919810
1 133
1 23333
1 33333
1 4333
1 5333
1 6333
1 222
1 998244353
*/

标签:1919810,题解,ll,nu,num,ans,include,CF3B,Lorry
来源: https://www.cnblogs.com/Konjac-Binaries/p/15441300.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有