计蒜客T1375 百钱买百鸡(四)

题目

百钱买百鸡问题:公鸡五文钱一只,母鸡三文钱一只,小鸡三只一文钱,用 100 文钱买 100 只鸡,公鸡、母鸡、小鸡各买多少只?

本程序要求解的问题是:给定一个正整数 n,用 n 文钱买 n只鸡,问公鸡、母鸡、小鸡各买多少只?
输入格式

输入一个正整数 n。
输出格式

如果有解,输出有多少种解(可以用正整数表示的解)。

如果无解,输出"No Answer."。
数据范围

1≤n≤1018

输出时每行末尾的多余空格,不影响答案正确性
样例输入

100

样例输出

4

思路

1.根据要求n钱买n鸡,所以当买1公鸡,就需要6小鸡凑成7钱买7鸡,每当买1母鸡,就需要3小鸡凑成4钱买4鸡,也就是说,需要用4钱和7钱去组合买鸡,才能满足n钱买n鸡
2.那么根据上述,看看n为几就满足?

n=1 不行
n=2 不行
n=3 不行
n=4=4
n=5 不行
n=6 不行
n=7=7
n=8=4+4
n=9 不行
n=10 不行
n=11=4+7
n=12=4+4+4
n=13 不行
n=14=7+7
n=15=4+4+7
n=16=4+4+4+4
n=17 不行
n=18=7+7+4
n=19=4+4+4+7
n=20=4+4+4+4+4
n=21=7+7+7

由上面可以看出,17是最后一个不行的数,因此可以先判断n是否符合条件

3.满足的话一定是有一种方案的,那么怎样就可以多一种方案?已知n是4和7组成的,那么多一种就是把4个7换为7个4或者反过来,因此每当n有一个28,就多一种替换方案

4.但是要注意,不是有几个28就可以全部替换
比如 100 = 28 ∗ 3 + 16 100=28*3+16 100=283+16 16 = 4 ∗ 4 16=4*4 16=44,都可以凑出来,所以有3个28替换,方案就是1+3种
比如29=28+1,去掉一个28后剩1,是凑不出来的,所以这个28不可以拿出来替换,29只能是 3 ∗ 7 + 2 ∗ 4 3*7+2*4 37+24一种方案
因此还需要看去掉28后的数是否满足,如果不满足,就要放回去一个28(根据2,大于28的一定可以凑出来)也就是方案减一,这样才能满足

代码

#include <bits/stdc++.h>

using namespace std;
typedef long long ll;

//int a={0,4,7,8,11,12,14,15,16,18,19,20,21,22,23,24,25,26,27,28...};
bool no(ll ans)
{
    
    
    if(ans==1||ans==2||ans==3||ans==5||ans==6||ans==9||ans==10||ans==13||ans==17)
        return true;
    else
        return false;
}
int main()
{
    
    
    ios::sync_with_stdio(false);
    ll n;
    cin>>n;
    ll sum=n/28; //有可能替换数,即多余方案
    ll ans=n%28; //剩余数
    if(no(n))//n本身无解
        cout<<"No Answer.";
    else
    {
    
    
        if(no(ans))//剩余数无解
            sum--;//放回一个28,方案减一
        cout<<sum+1;//sum是多的方案,要加必有的一个方案
    }
        

}

猜你喜欢

转载自blog.csdn.net/qq_44616044/article/details/108362761
今日推荐