链接:
https://www.nowcoder.com/acm/contest/121/C
来源:牛客网
来源:牛客网
题目描述
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
题解:贪心,优先队列,每次把a[i]放入优先队列,如果目前的糖果多余b[i],那么就直接走,如果不够,那么就将之前优先队列中的糖果top加到目前的糖果中,直到糖果多于b[i],这样就相当于之前在那个点补充了糖果,最后到达终点N后,再判断是不是补充了3次,如果没补充3次,因为求最大值,那么就将优先队列中的最大的几个值加上
#include<bits/stdc++.h>
#include<queue>
using namespace std;
int a[1010];
int b[1010];
int n;
bool flag;
int Time = 0;
int cur = 0;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
for(int i = 1; i <= n-1; i++)
cin >> b[i];
priority_queue< int >q;
for(int i = 1; i <= n-1; i++){
q.push(a[i]);
if (cur < b[i]){
if (Time == 3){ //已经添加了三次糖果,不能再添加
flag = 1;
break;
}
else if (Time < 3){ //没有添加三次,那么就增加糖果
while(!q.empty() && Time < 3 && cur < b[i]){
cur += q.top();
q.pop();
Time++;
}
if (cur < b[i]){
flag = 1;
break;
}
/*
Time++;
cur += q.top();
q.pop();
if (cur < b[i]){
flag = 1;
break;
} */
cur -= b[i];
}
}
else{
cur -= b[i];
}
}
q.push(a[n]);
if (flag == 0){
if (Time < 3){
while(!q.empty() && Time < 3){
cur += q.top();
q.pop();
Time++;
}
}
cout << cur << endl;
}
else
cout << -1 << endl;
return 0;
}