再帰3:道路の分岐点-2021年3月2日にさらに2番目

再帰3:道路の分岐

質問元:[SSL] 1561

トピック:

ジョンのN頭(1≤N≤1,000,000,000)の牛は、牧場周辺の土地を探索するために出発しました。三叉路に到達するまで道路を歩きます(すべての交差点はこのようになっていると考えられます)。現時点では、この牛の群れは2つのグループに分けられ、それぞれ次の2つの道路に沿って歩き続けることができます。彼らが再び三叉路に歩いた場合でも、2つのグループに分かれて歩き続けることは可能です。

牛の分割方法は非常に奇妙です。この牛の群れを正確に2つの部分に分割でき、2つの部分の牛の数が正確にK(1≤K≤1000)である場合、群れは3つに分割されます。道の交差点。そうでなければ、群れは分裂せず、彼らは皆ここにとどまり、平和に放牧します。最終的に何頭の牛が平和的に放牧されるかを計算してください。


2つの整数NとKを入力します。


群れ最終的な数を出力します。

入力サンプル
6 2

サンプル出力
3

アイデア:

この質問は一見非常に単純に見えますが、実際にはそれほど単純です。
言い換えれば、この質問のアイデアは非常に厄介であり、グループ化の観点からは非常に単純(nk)/ 2のように見えますが、実際には注意が必要な詳細がいくつかあります。
グループ化の2つの条件:1.nkは偶数である必要があり、2.nkは> 0、偶数= 0である必要があります。そうでない場合、無限ループに入ります。結局、0頭の牛はグループとは見なされません

コード:

詳細が異なるために大きく異なる2つのコードを表示します。

エラーコード↓

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ULL;
ULL n,k,k2;

ULL dg(ULL x)
{
    
    
	if((x-k)%2!=0||x<=k)
		return 1;
	else
		return dg((x/2)+k2)+dg((x/k)-k2);
} 
int main()
{
    
    
	cin>>n>>k;
	k2=k/2;
	cout<<dg(n);
	return 0;
}

ここに画像の説明を挿入します

ポジティブソリューションコード↓

#include<bits/stdc++.h>
using namespace std;
int n,k,h;

void dg(int x)
{
    
    
	if((x-k)>0&&(x-k)%2==0)
	{
    
    
		dg((x-k)/2);
		dg((x+k)/2);
	}
	else
		h++;
} 
int main()
{
    
    
	cin>>n>>k;
	dg(n);
	cout<<h;
	return 0;
}

ここに画像の説明を挿入します
事実が証明されています:詳細は非常に重要であり、不注意であってはなりません。さらに、自分で答えをプッシュできる場合は、送信する前にさらに数回テストしてください。そうしないと、それほど悲惨なことにはならず、非常にコストがかかります。

おすすめ

転載: blog.csdn.net/SSL_wyd/article/details/114291430