• 35-捡糖果


    链接:https://www.nowcoder.com/acm/contest/121/C
    来源:牛客网

    时间限制:C/C++ 1秒,其他语言2秒
    空间限制: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;
    }
    

      

     
  • 相关阅读:
    0316复利计算
    操作系统实验0
    0302-软件工程第一次作业
    1203有穷自动机
    11.11对同学们的作业一些评论
    1029 文法分析
    编译原理第一次上机作业感想
    词法分析编译感想
    0909 初识编译原理
    0909编译原理
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/9033520.html
Copyright © 2020-2023  润新知