rt,思路是记录每个数被操作几次最优,然后贪心算答案。
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int N=1e5+5;
int a[N],tp[N];
int n,m;
int sum,ans;
inline void solve(){
sum=ans=0;
cin>>n>>m;
rep(i,0,n-1) cin>>a[i],tp[i]=0;
rep(i,0,n-1){
int x=a[i],y=m/a[i],z=m/y;
if(x>=y&&x>=z){
tp[i]=0;
sum+=x;
}else if(y>=z){
tp[i]=1;
sum+=y;
}else{
tp[i]=2;
sum+=z;
}
}
int i=0;
while(i<n){
if(tp[i]==0){
i++;
continue;
}
int j=i;
while(j<n&&tp[j]!=0) j++;
int cnt1=0,cnt2=0;
int k=i;
while(k<j){
int tpk=tp[k],r=k;
while(r<j&&tp[r]==tpk) r++;
if(tpk==1) cnt1++;
else cnt2++;
k=r;
}
ans+=min(cnt2+1,cnt1+2*cnt2);
i=j;
}
cout<<sum<<' '<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
int T;
cin>>T;
while(T--) solve();
return 0;
}
/*
1
5 10
1 5 2 4 3
*/