(ファイルIO):入力:fruit.in出力:fruit.out
制限時間:1000msのスペースの制約:262144キロバイトの特定の制限
後藤ProblemSet
タイトル説明
ベッシーは再び乱入しました
家!彼女は台所で(各杭の無限の数があります)レモンとオレンジの束の束を見つけ、彼女はできるだけ食べることを望んでいます。
ベッシーは、完全な上腹部値を持っています
。オレンジを食べることは、彼女を増やすことができます
満腹値のポイントは、レモンを食べて、彼女が増加します
ポイント値膨満
彼女が喜んであれば、ベッシーは、それはすぐに、彼女の満腹値が半分になるようになりますベッシーヘルプあなたは利用できる彼女の最大値の膨満感を見つけ、一度ほとんどで水を飲むことができます。
入力
ラインを3つの整数を
と
出力
ライン得られる最大ベッシーのフルネスの値を表す整数
サンプル入力
856
サンプル出力
8
データ範囲の制限
問題解決のためのアイデア
この問題は、深い探索問題です。レモン満腹値を食べて、飲んで、オレンジを検索し、できるようになります
A。から
クロスボーダーと重複することに最大の注意を見つけるために、それが表示され、再帰的にすべての場合に始めます。コードを参照してください。
コード
#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<stdio.h>
#include<iomanip>
#include<cmath>
using namespace std;
int t,a,b,ans;
bool f[5000010],p;
void dfs(int s){
f[s]=1;
if(s+a<=t)
{
ans=max(ans,s+a);
if(s+a==t)
{
printf("%d",t);
exit(0);
}
if(f[s+a]==0)
dfs(s+a);
}
if(s+b<=t)
{
ans=max(ans,s+b);
if(s+b==t)
{
printf("%d",t);
exit(0);
}
if(f[s+b]==0)
dfs(s+b);
}
if (p==0&&f[s/2]==0)
{
p=1;
dfs(s/2);
p=0;
}
}
int main(){
freopen("fruit.in","r",stdin);
freopen("fruit.out","w",stdout);
scanf("%d%d%d",&t,&a,&b);
if(t==a||t==b||t%a==0||t%b==0)
{
printf("%d",t);
return 0;
}
dfs(0);
printf("%d",ans);
}