(Jizhong)2219果実の饗宴(フルーツ)深い[検索]

(ファイルIO):入力:fruit.in出力:fruit.out
制限時間:1000msのスペースの制約:262144キロバイトの特定の制限
後藤ProblemSet


タイトル説明
ベッシーは再び乱入しました F A R メートル E R J インクルード 時間 n個 ファーマージョン 家!彼女は台所で(各杭の無限の数があります)レモンとオレンジの束の束を見つけ、彼女はできるだけ食べることを望んでいます。
ベッシーは、完全な上腹部値を持っています T ( 1 < = T < = 5 , 000 , 000 ) T(1 <= T <= 5,000,000) オレンジを食べることは、彼女を増やすことができます A A 満腹値のポイントは、レモンを食べて、彼女が増加します B B ポイント値膨満 ( 1 < = A , B < = T ) (1 <= A、B <= T) 彼女が喜んであれば、ベッシーは、それはすぐに、彼女の満腹値が半分になるようになりますベッシーヘルプあなたは利用できる彼女の最大値の膨満感を見つけ、一度ほとんどで水を飲むことができます。


入力
ラインを3つの整数を T , A T、A B B

出力
ライン得られる最大ベッシーのフルネスの値を表す整数


サンプル入力
856

サンプル出力
8


データ範囲の制限


問題解決のためのアイデア
この問題は、深い探索問題です。レモン満腹値を食べて、飲んで、オレンジを検索し、できるようになります A A A。から 0 0 クロスボーダーと重複することに最大の注意を見つけるために、それが表示され、再帰的にすべての場合に始めます。コードを参照してください。


コード

#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);
}
公開された119元の記事 ウォンの賞賛8 ビュー4921

おすすめ

転載: blog.csdn.net/kejin2019/article/details/104827737