首页 > 其他分享 >3B(小小贪心)

3B(小小贪心)

时间:2022-11-17 16:34:39浏览次数:75  
标签:小小 cnt int ++ vv 物品 3B 价值 贪心

题目链接

题目大意:

有一辆载重量为 v 的货车, 准备运送两种物品。 物品 A 的重量为 1, 物体 B 的重量为 2, 每个物品都有一个价值。 求货车可以运送的物品的最大价值。

输入格式

第一个行包含两个整数 n 和 v,分别表示有 n 个物品, 货车的载重量为 v。 (1 ≤ n ≤ 10^5; 1 ≤ v ≤ 10^9)

接下来 n 行, 每行两个整数, 分别表示物品的重量 ti 和价值 pi。 , (1 ≤ ti ≤ 2; 1 ≤ pi ≤ 10000)

输出格式

第一行, 一个整数, 表示最大价值。

第二行 构成最大价值的物品的编号(如果答案不唯一 请输出其中任何一个)

思路:

大眼一看是背包问题,仔细一看V的数据范围是10^9算了吧,一定不是动态规划的背包了。那回是什么啊?题目中有说是最大价值,似乎和贪心有关系。确实,这题目用贪心的做法是可以A的。那怎么贪呢?

题目描述中有明确说明,物品的体积只可能是1或者2,那么我们是不是可以讨论呢?如果货车的容积为奇数的话,要保证其货品的价值最大化我们需要装至少一个体积为1的物品。那么剩下的体积为一的物品我们就可以将其转化为体积为二的物品(当然,我们为保证价值最大化需要将最大价值的体积为一的单独拿出来),先将体积为1物品根据价值由大到小进行排序,再将其转化为体积为2的物品,最后对处理后的物品排序即可。只是中间需要一些细节。比如如果最大价值为0的话,那他一定没有装任何物品,直接返回即可。还要注意数据范围,不要爆int了,这里直接开的long long .

AC代码如下:

#include<bits/stdc++.h>
#define L(i, j, k) for(int i = (j); i <= (k); ++i)
#define R(i, j, k) for(int i = (j); i <= (k); --i)
#define int long long
#define sz(a) ((int) (a).size())
#define vi vector< int >
#define me(a, x) memset(a, x, sizeof(a))
#define ull unsigned long long

using namespace std;
const int N = 1e5 + 7;

struct hh
{
	int w;
	int a, b;
	int v;
	int cnt;
} a[N], b[N]; 
int n, v;
int cnt_a, cnt_b;

bool cmp(struct hh a, struct hh b)
{
	return a.w > b.w;
}

void Main()
{
	cin >> n >> v;
	for(int i = 1; i <= n; i++ )
	{
		int op, w;
		cin >> op >> w;
		if(op == 2) 
		{
			a[cnt_a].cnt = 1, a[cnt_a].a = i, a[cnt_a].w = w, a[cnt_a++].v = op;
			
		}
		else 
		{
			b[cnt_b].cnt = 1, b[cnt_b].w = w, b[cnt_b].a = i,  b[cnt_b++].v = op;
		} 
	}
	sort(b, b + cnt_b, cmp);
		
	if(v & 1) 
	{
		a[cnt_a].w = b[0].w, a[cnt_a].cnt = 1, a[cnt_a].v = 1, a[cnt_a++].a = b[0].a;
		for(int i = 1; i + 1 < cnt_b; i += 2 )
		{
			int x = b[i].w + b[i + 1].w;
			a[cnt_a].w = x, a[cnt_a].a = b[i].a, a[cnt_a].b = b[i + 1].a, a[cnt_a].cnt = 2, a[cnt_a++].v = 2;  
		}
		if(!(cnt_b & 1)) a[cnt_a].w = b[cnt_b - 1].w, a[cnt_a].cnt = 1, a[cnt_a].a = b[cnt_b - 1].a, a[cnt_a++].v = 1;
	}
	else 
	{
		for(int i = 0; i + 1 < cnt_b; i += 2 )
		{
			int x = b[i].w + b[i + 1].w;
			a[cnt_a].w = x, a[cnt_a].a = b[i].a, a[cnt_a].b = b[i + 1].a, a[cnt_a].v = 2, a[cnt_a++].cnt = 2;
		}
		if(cnt_b & 1) a[cnt_a].w = b[cnt_b - 1].w, a[cnt_a].cnt = 1, a[cnt_a].a = b[cnt_b - 1].a, a[cnt_a++].v = 1;
	}
	
	sort(a, a + cnt_a, cmp);
	
	int V = v;
	int res = 0;
	for(int i = 0; i < cnt_a; i ++ )
	{
		
		int vv;
		vv = a[i].v;
		if(vv > V) continue;
		V -= vv;
		res += a[i].w;
		if(!V) break;
	}
	
	cout << res << '\n';
	if (!res) return ;//0就没有结果呗 
	
	V = v;
	for(int i = 0; i < cnt_a; i ++ )
	{
		int vv;
		vv = a[i].v;
		if(vv > V) continue;
		V -= vv;
		if(a[i].cnt == 1)
		{
			cout << a[i].a << ' ';
		}
		else 
		{
			cout << a[i].a << ' ' << a[i].b << ' ';
		}
		if(!V) break;
	}
	

}


signed main(){
	ios :: sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	Main();
	return 0;
}

/* stuff you should look for 你应该寻找的东西
 * int overflow, array bounds (int)溢出,数组边界
 * special cases (n=1?) 特殊情况(n=1?)
 * do smth instead of nothing and stay organized 做一些事情而不是什么也不做,保证效率
 * WRITE STUFF DOWN 将东西写下
 * DON'T GET STUCK ON ONE APPROACH 不要在一个地方死磕
 */

 

标签:小小,cnt,int,++,vv,物品,3B,价值,贪心
From: https://www.cnblogs.com/msluli/p/16899889.html

相关文章

  • 代码随想录第三十六天|贪心算法
    今天继续是贪心算法  435.无重叠区间classSolution{publicinteraseOverlapIntervals(int[][]intervals){intn=intervals.length;......
  • 代码随想录第三十五天 | 贪心算法
     第三十五天,继续贪心 860.柠檬水找零 classSolution{publicbooleanlemonadeChange(int[]bills){intn=bills.length;if(bills[0......
  • 20221115_T3A+_贪心二分
    题意你在和Yazid做游戏。Yazid给了你一棵\(n\)个节点的树,并让你删除这棵树上的恰好\(k\)条边,使得整棵树被分成\(k+1\)个连通块。你觉得太简单了,随便删k条边......
  • 代码随想录第三十四天|贪心算法
    今天继续贪心算法,重点是学习贪心算法的思维 1005.K次取反后最大化的数组和 classSolution{publicintlargestSumAfterKNegations(int[]nums,intk){......
  • 1710. 卡车上的最大单元数 ----- 贪心算法,自定义sort排序
    请你将一些箱子装在一辆卡车上。给你一个二维数组boxTypes,其中boxTypes[i]=[numberOfBoxesi,numberOfUnitsPerBoxi]:numberOfBoxesi是类型i的箱子的数量。numb......
  • 20221114_T4B_拓扑排序贪心
    题意L国正在举行各种会议,但是可怜的是L国只有一个主持人,每场会议的开始主持人都必须去主持会议,使会议得以开始,在会议开始后主持人可以离开。 主持人不会分身,他在一个时刻......
  • 代码随想录训练营第三十二天|贪心算法
    本来这是第三十一天的内容,但是三十一天的时候写成第三十二天的了,因此今天写第三十一天的内容 455.分发饼干 classSolution{publicintfindContentChildre......
  • 20221113_T2A_背包贪心
    题意Steve的城堡正在被大量的怪物袭击。共有\(n\)个怪物正在袭击城堡,第\(i\)个怪物的攻击力为\(a_i\),防御力为\(b_i\)。城内有\(m\)个怪物猎人,第\(j\)个怪物......
  • 代码随想录训练营第三十一天 | 贪心算法
    贪心算法的核心思想是在每一步决策中都找到局部最优解122.买卖股票的最佳时机classSolution{publicintmaxProfit(int[]prices){intn=prices.le......
  • 贪心
    455.分发饼干假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。对每个孩子i,都有一个胃口值g[i],这是能让孩子们满足胃口的饼干的......