Question:题目详情(https://www.bnuoj.com/bnuoj/contest_show.php?cid=8520#problem/101259)
题目大意:有a0,a1,a2枚面值为1,2,3的硬币,问能组成多少种面值
解题思路:只是一道找规律的题,可以考虑面值为1的数量如果为0,只有2,3时(都不为0):只有面值为2的只有一枚是为1+2*a3(加1是因为有个2,2*a3是因为每个3的倍数都可以加2),其余请况都为(2*a2+3*a3)-2,为最大值减去2(一个是‘1’,另一个是最大之前面一个数,可以自己推一下),如果面值为‘1’的数量为1时,‘2’数量不为时,每加入一个‘2’可以换出一个‘1’再把‘1’加进去长度加2,每个 ‘2 ’都可以使长度加2,相对而言‘3’可以使长度加3,‘2’数量为0时,直接为2*a3+1,当a0>1时,一个‘2’加2,一个‘3’加3(详情见代码)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
using namespace std;
typedef long long LL;
const int INF=0x3f3f3f3f;
int main()
{
LL a1,a2,a3;
LL ans=0;
scanf("%lld%lld%lld",&a1,&a2,&a3);
if(a1>1) //当a1>!时,直接一个‘2’使长度加2,一个‘3’使长度加‘3’
{
ans+=a1;
ans+=2*a2;
ans+=3*a3;
}
else if(a1==1)
{
if(a2==0) //a2=0,每个3的倍数都可以加1形成一个新的面值,加1是‘1’这个数
{
ans+=2*a3+1;
}
else //如果‘2’不为0,用‘2’换完了‘1’以后,‘3’换出‘2’和‘1’,跟‘2’换‘1’完全一样使长度加3
{
ans+=a1;
ans+=2*a2;
ans+=3*a3;
}
}
else if(a1==0)
{
if(a2==0)
ans+=a3;
else
{
if(a3==0)
{
ans+=a2;
}
else
{
if(a2==1) //只有a2==1时特殊情况,每个3的倍数都可以加上2,形成一个新的面值,加1是因为‘2’这个值
ans+=2*a3+1;
else ans+=(a2*2+a3*3)-2; //其余请况都为相加最大值减去2(一个数是‘1’另一个数为最大值前一个数),,1~最大值,就这两个数没有,
}
}
}
printf("%lld\n",ans);
return 0;
}
体会:对于这种找规律的题,不能慌,慢慢找规律。