G - equeue

文章描述了一种编程题目,要求在给定的操作次数限制下,通过从两端取出和插入珠宝,最大化手持珠宝的总价值。解决方案利用了优先队列,通过两层循环遍历不同操作组合,并考虑剩余操作数用于优化珠宝放置,以达到最大价值。
摘要由CSDN通过智能技术生成

第五周任务 [Cloned] - Virtual Judge (vjudge.net)

【题目描述】

你的朋友送了你一个排队作为生日礼物。D

D是一个水平圆柱体,包含一排珠宝。N

珠宝的价值从左到右。可能有负值的珠宝。V1​,V2​,...,VN

一开始,你手中没有宝石。

大多数时间(可能为零次)可以对 执行大多数操作,从以下选项中选择:

  • 操作A:取出最左边的宝石,拿在手里。当为空时,无法执行此操作。D

  • 操作B:取出里面最右边的宝石,拿在手里。当为空时,无法执行此操作。D

  • 操作C:选择手中的宝石,将其插入。当您手中没有宝石时,您无法执行此操作。D

  • 操作D:选择手中的宝石,将其插入。当您手中没有宝石时,您无法执行此操作。D

在操作后找到您手中珠宝价值的最大可能总和。

【输入】

  • 输入中的所有值都是整数。
  • 1≤N≤50
  • 1≤K≤100
  • −107≤Vi​≤107

【输出】

操作后打印手中珠宝价值的最大可能总和。

解题思路

题意大概是:在有限的操作下,拿在手上的珠宝价值最大。

要注意的是,手上不止可以拿一个珠宝,可以拿多个,要拿到最大价值的珠宝,主要是操作数的限制。

此处用到优先队列,可以很迅速地解决问题。

用两层循环,遍历左端和右端的操作数,第一层循环是拿左端的珠宝用的操作数,第二层循环是拿右边的珠宝用的操作数,接着就是根据操作数取走珠宝,内部用循环将珠宝放入优先队列中。

接着看是否存在剩余操作数k,剩余操作数k可以用掉作为把珠宝放回,或者是不放回去,因为此时手中的珠宝价值都大于零了。这里要用的while循环,要考虑队列的长度,剩余操作数,还有手中最小价值的珠宝是否大于零。

接着将队列中的元素累加并出队,并与ans比较,sum>ans,就将ans赋为sum。

数据范围不大,可以用int存储。

代码如下

#include<iostream>
#include<algorithm>
#include<queue>
#define ll long long
using namespace std;
int n, m;
ll a[105];
priority_queue<ll, vector<ll>, greater<ll> >s;
int main()
{
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    ll ans = 0;
    for (int i = 0; i <= m; i++) {
        for (int j = 0; (i + j) <= min(n, m); j++) {
            for (int q = 1; q <= i; q++)
                s.push(a[q]);
            for (int q = n; q >=n-j+1; q--)
                s.push(a[q]);
            int k = m - i - j;
            while (s.size() && s.top() < 0 && k){
                s.pop();
                k--;
            }
            ll sum = 0;
            while (s.size()){
                sum += s.top();
                s.pop();
            }
            ans = max(sum, ans);
        }
    }
    cout << ans << endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

明里灰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值