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

猜你喜欢

转载自www.cnblogs.com/DreamingBetter/p/12183060.html