(File IO): input:fruit.in output:fruit.out
时间限制: 1000 ms 空间限制: 262144 KB 具体限制
Goto ProblemSet
题目描述
贝茜又再一次地闯入了
F
a
r
m
e
r
J
o
h
n
Farmer John
FarmerJohn 的房子!她在厨房发现了一堆柠檬和一堆橘子(每堆都有无限多个),并且,她希望尽可能地多吃。
贝茜的有一个饱腹值上限
T
(
1
<
=
T
<
=
5
,
000
,
000
)
T(1<=T<=5,000,000)
T(1<=T<=5,000,000)。吃一个橘子会增加她
A
A
A 点饱腹值,吃一个柠檬会增加她
B
B
B 点饱腹值
(
1
<
=
A
,
B
<
=
T
)
(1<=A,B<=T)
(1<=A,B<=T),如果她愿意,贝茜可以最多喝一次水,这会立即使她的饱腹值变成一半,请你帮助贝茜求出她可以获得的最大饱腹值。
输入
一行三个整数
T
,
A
T,A
T,A 和
B
B
B
输出
一行一个整数,表示贝茜可获得的最大饱腹值
样例输入
8 5 6
样例输出
8
数据范围限制
解题思路
本题就是一道深搜题。搜索吃橘子、吃柠檬和喝水的饱腹值,就能
A
A
A了。从
0
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);
}