蒟蒻求助思路
查看原帖
蒟蒻求助思路
1174770
xiaoqimingbozai楼主2025/7/2 19:47

本蒟蒻想了一下午想不明白为什么不能直接加上 xy|x-y| 每一位对应的二进制数的最小权值?为什么要费大力气搞DP?求大佬点拨。

回复必关注

附上蒟蒻 2727 分代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int T;
ll dp[36],a[36],inf=1e18;
/*
1
4 23 3
1 5 2 4
*/
ll work(ll z)//直接求每一位的最小值
{
	ll ans=0;
	int i=0;
	while(z)
	{
		if(z&1)
		{
			ans+=dp[i];
		}
		z>>=1;
		i++;
	}
	return ans;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>T;
	while(T--)
	{
		memset(a,0x7f,sizeof a);
		memset(dp,0,sizeof dp);
		ll x,y;
		int k;
		cin>>x>>y>>k;
		for(int i=0;i<=k;i++)
		{
			cin>>a[i];
		}
		if(x==y)
		{
			cout<<0<<'\n';
			continue;
		}
		dp[0]=a[0];
		for(int i=1;i<=32;i++)
		{
			dp[i]=min(a[i],min(inf,dp[i-1]*2));//记录每一位权值
		}
		ll z=abs(x-y);
		ll ans=work(z);
		for(int i=0;i<=32;i++)
		{
			if((1ll<<i)>z)
			{
				ans=min(ans,min(inf,dp[i]+work((1ll<<i)-z)));//计算从大减到小的答案
			}
		}
		cout<<ans<<'\n';
	}
	return 0;
}
2025/7/2 19:47
加载中...