(贪心)cf#523-B.Views Matter

http://codeforces.com/contest/1061

给出x,y,呈现俯视图和侧视图,求可以去掉多少块是这两个视图不改变
5 6
3 3 3 3 3
10
首先想到排序,由大到小,在n+1个位置增加一个0的高度块用于解第n个块。
从第2个块开始
对于前一个块高度更高时,已使用块数目 += 高度差
对于当前块比前一块高度相等或者更大时,因为俯视图不能变,所以至少留下一块,即已使用块数目++,将当前块高设为 前一块高-1。特判前一块高度为0时,直接将已使用块数目 += 未处理的数量
相当于用高度设为已处理的y轴,特判为0的情况就行,解法很多。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10;
typedef long long ll;
int a[maxn];
bool cmp(int x, int y) {
	return x > y;
}
int main()
{
	int n, m;
	while(cin >> n >> m) {
		ll ans = 0;
		for(int i = 1; i <= n; i++) {
			cin >> a[i];
			ans += a[i];
		}
		sort(a + 1, a + n + 1, cmp);
		a[n + 1] = 0;
		ll x = 0;
		for(int i = 2; i <= n + 1; i++) {
			if(a[i - 1] > a[i])  x += a[i - 1] - a[i];
			else {
				if(a[i - 1] == 0) {
					x += n - i + 2;
					break;
				}
				else x++, a[i] = a[i - 1] - 1;
			}
		}
		cout << ans - x << endl;
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
背包问题是计算机科学中经典的动态规划问题,通常涉及到在给定的物品和总容量限制下,选择能够达到最大价值的物品组合。根据你的问题,我将解释三种常见的贪心策略用于解决背包问题: 1. **价值最大(Value-Based Greedy)**:在这种策略下,我们会优先选择价值最大的物品,即使其重量超过剩余背包容量。每次选取当前剩余容量内价值最高的物品,直到背包装满或没有可选物品。这种方法并不保证总是最优解,因为可能错过了其他轻重比更优的组合。 2. **重量最小(Weight-Based Greedy)**:也称为容量最优化,按照物品的重量进行排序,优先选择重量较小的物品。这样可以保证每一步都尽量减小背包的重量,但可能会牺牲部分价值,特别是当存在价值密度高的物品时。 3. **价值率最高(Value-to-Weight Ratio)**:对于每件物品,计算其价值与其重量的比率(价值/重量),然后选择比率最高的物品放入背包。这种方法确保每单位重量都能获取到最大的价值,但可能无法得到总价值最大的组合,尤其是在物品价值和重量分布不均匀时。 为了实现这些策略,你给出的代码片段(`#include`部分)看起来像是C语言,但是完整的背包问题算法通常会包含一个动态规划的循环结构,比如使用双重循环来遍历所有可能的物品和它们的组合。在实际代码中,你会维护两个变量:一个表示当前背包的总价值,另一个表示当前背包的总重量,然后根据上述策略更新这些值。 **相关问题--:** 1. 贪心算法是如何处理背包问题的? 2. 在价值最大策略中,如何确定物品的优先级? 3. 在价值率最高策略中,如何计算物品的价值率? 如果你需要完整的背包问题贪心算法示例,请提供更多信息,或者我可以直接讲解代码实现过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值