原题链接这里
思路三分钟,调代码两小时,又被教育场教育了一下。
这道题的oj卡的厉害,差不多O(n)的都被卡,最后写了个严格O(n),一点废话都没有的代码才给过……
思路就是贪心,当前缀和超过s的时候,跳最大的看看能不能多礼物/礼物持平,可以就跳最大的,跳了没收益就不跳了输出0。
#include<iostream>
#include<algorithm>
using namespace std;
const int N=100010;
int main()
{
int t;
cin>>t;
while(t--){
int n,s;
cin>>n>>s;
int a[N];
for(int i=1;i<=n;i++) cin>>a[i];
int ans=0,m=0; //存答案、目前最大的数
long long sum=0;//存前缀和
for(long long i=1;i<=n;i++){
if(a[i]>a[m]) m=i;
sum+=a[i];
if(sum>s&&sum-a[m]<=s) ans=m; //如果此时和大于s,但减去最大值之后小于s,就跳
}
cout<<ans<<endl;
}
}
不被教育一下不知道自闭两个字怎么写……