zoukankan      html  css  js  c++  java
  • B Verse For Santa

    题意:一组不可改变顺序的数组a[n],从头开始求和,至多允许跳过一个数,使取最多数出来求和并且和小于s,求跳过该数的位置,如果没有跳过则输出0。

    思路:从头开始求和sum,用maxx标记出目前已加过的最大值的位置,当sum>s的时候退出循环;

       判断如果数组所有数之和小于s(或者说i>n循环走完),无需跳过某个数,则输出0;

       如果sum>s,则判断减去最大值加上i的下一个值,如果小于s,即可跳过最大值,输出最大值位置。

       否则输出0,没必要跳过。

    #include<stdio.h>
    #include<algorithm>
    #define N 1e5+10
    using namespace std;
    int main(){
            long long int t,i,n,s,a[int(N)],sum,maxx;
            while(~scanf("%lld",&t)){
                    while(t--){
                            scanf("%lld %lld",&n,&s);
                            for(i=1;i<=n;i++){
                                    scanf("%d",&a[i]);
                            }
                            maxx=1;
                            sum=0;
                            for(i=1;i<=n;i++){
                                    sum+=a[i];
                                    if(a[i]>a[maxx])
                                            maxx=i;
                                    if(sum>s) break;
                            }
                            if(i>n) printf("0\n");
                            else{
                                    if(sum-a[maxx]+a[i+1]<=s)
                                            printf("%lld\n",maxx);
                                    else printf("0\n");
                            }
                    }
            }
    }
    View Code
  • 相关阅读:
    CodeForces 1059B
    CodeForces 714A
    浅析母函数
    CodeForces 816C 思维
    CodeForces 816B 前缀和
    CodeForces
    Java项目读取resources资源文件路径那点事
    原型模式
    一次给女朋友转账引发我对分布式事务的思考
    连续最大字段和问题
  • 原文地址:https://www.cnblogs.com/DreamingBetter/p/12183060.html
Copyright © 2011-2022 走看看