第13回ブルーブリッジカップ州E:X-ary減算(貪欲)

1つの整数の行を出力します。これは、10進数に変換されてから1e9+7を法とするX基数ABの結果の可能な最小値を表します。

分析、これは実際には貪欲な問題です。まず、各数値の重みを決定するものを見てみましょう。質問で与えられた数値を見てみましょう。321と3が配置されているビットは8進数です。2が配置されている桁は10進数です。 、および1が配置されている桁は2進数です。明らかに、下位2桁ごとに2桁目に入力でき、10秒ごとに1桁目に、つまり2*103分の1ごとに入力できることがわかります。ビットは最初のビットに入ることができます。i番目のビットの重みは、実際にはi番目のビットよりも低いビットの底の積であることがわかります。2進数と10進数も理解しやすいので、わかりません。これについてもっと言う

AがBよりも大きいことはすでにわかっているので、ABをできるだけ小さくするには、高レベルの重みをできるだけ小さくし、低レベルの重みの影響を無視できるようにする必要があります。なぜですか。高い位置の重みが1減少すると、すべての低い位置の合計よりも大きな影響があるため、貪欲な戦略は高い位置の重みを減らすことです。重み、低い位置が上にあるとき、各桁のベースが最小になると、各桁が2つの数値aとbを与えるため、この時点で高い位置の重みが最小になることがわかります。基数はa以下またはb以下にすることはできないため、ビットの基数をaおよびbの最大値に1を加えた値にするだけで済みます。

コードは次のとおりです。

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
using namespace std;
const int N=1e6+10;
const int mod=1e9+7;
long long a[N],b[N];
int main()
{
	int n,lena,lenb;
	scanf("%d%d",&n,&lena);
	for(int i=lena;i>=1;i--)
		scanf("%lld",&a[i]);
	scanf("%d",&lenb);
	for(int i=lenb;i>=1;i--)
		scanf("%lld",&b[i]);
	long long ans=0,mul=1;
	for(int i=1;i<=lena;i++)
	{
		ans=(ans+(a[i]-b[i])*mul)%mod;
		long long t=max(a[i],b[i])+1;
		if(t<2) t=2;
		mul=mul*t%mod;
	}
	printf("%lld",ans);
	return 0;
}

おすすめ

転載: blog.csdn.net/AC__dream/article/details/124066398