链接:https://www.nowcoder.com/acm/contest/121/C
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
空间限制:C/C++ 131072K,其他语言262144K
64bit IO Format: %lld
题目描述
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] ( 1<=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;
int a[1005];
int b[1005];
int main(){
int n;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a[i];
}
for(int i = 0; i < n - 1; i++){
cin >> b[i];
}
priority_queue<int> myq;
int sum = 0, ct = 0;
for(int i = 0; i < n - 1; i++){
myq.push(a[i]);
// if(sum < b[i]){
// sum += myq.top(); //加一次不一定就够了,但是题目数据可以水过!!!
// myq.pop();
// sum -= b[i];
// ct++;
// }
if(sum < b[i]){
while(sum < b[i]){
sum += myq.top();
myq.pop();
ct++;
}
sum -= b[i];
}
else{
sum -= b[i];
}
if(ct > 3 || sum < 0){
cout << "-1" << endl;
return 0;
}
}
myq.push(a[n - 1]);
while(ct < 3){
sum += myq.top();
myq.pop();
ct++;
}
cout << sum << endl;
return 0;
}
浙公网安备 33010602011771号