求hack
查看原帖
求hack
378915
ZjfAKIOI楼主2025/6/30 18:08

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
*/
2025/6/30 18:08
加载中...