求 Hack,只能过 Subtask 3&4
查看原帖
求 Hack,只能过 Subtask 3&4
1105993
Misserina楼主2025/7/3 23:06
#include <bits/stdc++.h>
using namespace std;
int t,n;
long long m,tot,arr[100005];
int dp[100005][4],type[100005];
int main() {
	scanf("%d",&t);
	while (t--) {
		scanf("%d%lld",&n,&m);
		tot=0;
		for (int i=1;i<=n;i++) {
			scanf("%lld",&arr[i]);
			if (arr[i]>m/arr[i]) {
				if (arr[i]>=m/(m/arr[i])) {
					type[i]=0;
					tot+=arr[i];
				}
				else {
					type[i]=2;
					tot+=m/(m/arr[i]);
				}
			}
			else if (arr[i]<m/arr[i]) {
				type[i]=1;
				tot+=m/arr[i];
			}
			else {
				type[i]=-1;
				tot+=arr[i];
			}
			//printf("%d ",type[i]);
		}
		//printf("\n");
		for (int i=1;i<=n;i++) {
			if (type[i]==0) {
				dp[i][0]=dp[i-1][0];
				dp[i][1]=min(min(dp[i-1][0],dp[i-1][1]),min(dp[i-1][2],dp[i-1][3]))+1;
				dp[i][2]=min(dp[i-1][0],dp[i-1][2]);
				dp[i][3]=min(dp[i-1][1],dp[i-1][3]);
			}
			else if (type[i]==1) {
				dp[i][0]=min(dp[i-1][0],dp[i-1][1])+1;
				dp[i][1]=min(min(dp[i-1][0],dp[i-1][1]),dp[i-1][2]+1);
				dp[i][2]=dp[i-1][2]+1;
				dp[i][3]=min(dp[i-1][1],dp[i-1][3])+1;
			}
			else if (type[i]==2) {
				dp[i][0]=min(dp[i-1][0],dp[i-1][2])+2;
				dp[i][1]=min(min(dp[i-1][0],dp[i-1][1]),min(dp[i-1][2],dp[i-1][3]))+1;
				dp[i][2]=min(dp[i-1][0],dp[i-1][2]);
				dp[i][3]=min(dp[i-1][1],dp[i-1][3])+2;
			}
			else {
				dp[i][0]=min(dp[i-1][0],dp[i-1][1]+1);
				dp[i][1]=min(min(dp[i-1][0],dp[i-1][1]),min(dp[i-1][2],dp[i-1][3])+1);
				dp[i][2]=dp[i-1][2];
				dp[i][3]=min(dp[i-1][1],dp[i-1][3]);
			}
			//printf("%d %d %d\n",dp[i][0],dp[i][1],dp[i][2]);
		}
		printf("%lld %d\n",tot,min(min(dp[n][0],dp[n][1]+1),min(dp[n][2]+2,dp[n][3]+1)));
	}
}
2025/7/3 23:06
加载中...