一,思路:
这题其实你只要知道一个点,海妖攻击前后两端的次数是固定的(循环的攻击),那么用双指针模拟两端情况即可。
二,代码:
#include <iostream>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=2e5+10,M=1e9+7;
typedef long long ll;
typedef pair<int,int> pii;
int arr[N];
void Solved() {
ll n,k;
cin>>n>>k;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
int l=1,r=n;
ll cnt=0;
//两端的攻击次数
ll num1=(k+1)/2,num2=k/2;
while(l<r){
//当两端的指针都停下来后,说明攻击停止了(或者所有船只被打没)
int flag1=0,flag2=0;
//模拟过程,如果耐久度小于(num1|num2),那么船会被击沉,指针移动
if(num1>=arr[l]){
cnt++;
num1-=arr[l];
l++;
flag1=1;
}
if(num2>=arr[r]){
cnt++;
num2-=arr[r];
r--;
flag2=1;
}
if(flag1==0&&flag2==0) break;
}
//边界情况,当两边指针都停在最后一个船上,那么就会联合攻击他
if(l==r){
if(num1+num2>=arr[l]) cnt++;
}
cout<<cnt<<endl;
}
int main()
{
int t;
cin>>t;
while(t--) {
Solved();
}
return 0;
}