题意:一组不可改变顺序的数组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"); } } } }