iko和她的糖(贪心算法)

链接:https://ac.nowcoder.com/acm/problem/15891
来源:牛客网

题目描述

iko超级超级喜欢吃糖,有一天iko想出去玩,她计划从1点走到N点(按1,2,3,…,n的顺序走),每个点都有一个补给站,第i点的补给站有a[i]颗糖,从i点走到i+1点会消耗掉b[i]颗糖,iko在出游的途中可以选择三个补给站,iko想知道她走完全程到达N点时口袋里最多还能剩下几颗糖(初始时iko的口袋里一颗糖都没有)。

输入描述:

第一行输入N(3<=N<=1000)
第二行输入N个数代表a[1]…a[N] (0<=a[i]<=1000 )
第三行输入N-1个数代表b[1]…b[N-1] ( 0<=b[i]<=1000 )

输出描述:

输出一个数字表示iko到达n点时口袋里最多剩下的糖,
若不能到达N点输出-1。

示例1

输入

3
1 3 4
3 4

输出

-1

示例2

输入

5
3 4 5 2 4
3 2 2 2

输出

3

经典贪心,将经过的补给站放入一个优先队列,直到当前糖果不够向右走或到达终点时再从优先队列中获取最大的补给。

#include <bits/stdc++.h>
using namespace std;
const int N = 1005;

int a[N], b[N];
priority_queue<int> que;

int main(void)
{
    int n, val = 0, num = 3;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
    }
    for (int i = 1; i < n; i++) {
        cin >> b[i];
    }
    
    for (int i = 1; i < n; i++) {
        //获得当前补给站
        que.push(a[i]);
        //如果糖果不够向下走
        while (val < b[i]) {
            if (num && que.size()) {
                val += que.top(); que.pop();
                num--;
            } else {
                cout << -1 << endl;
                return 0;
            }
        }
        //糖果够向下走
        val -= b[i];
        
    }
    //最后一个补给站
    que.push(a[n]);
    while (num && que.size()) {
        val += que.top(); que.pop();
        num--;
    }
    cout << val << endl;
    
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43772166/article/details/107007838