【习题】N钱买N鸡 O(n)

N钱买N鸡

Question:LuoGu U124192 N钱买N鸡

Question Link:luogu.com.cn/problem/U124192

Question Algorithm:MathKnowledge

Question Difficulty Level:★★☆☆☆

Question Time Complexity:O(n)

Question Description:

题目描述

一只公鸡值 5 5 5元,一只母鸡值 3 3 3元,而 1 1 1元可买 3 3 3只小鸡。
现有 n n n元钱,想买 n n n只鸡。问有多少种买法?

所有钱要用完,某种鸡可以不买。

输入格式

输入一个数 n n n

输出格式

可行的买法数。

实例输入
100
实例输出
4
数据规模

对于 20 % 20\% 20%的数据:( 1 ≤ n ≤ 1 0 3 1 ≤ n ≤ 10^3 1n103

对于 50 % 50\% 50%的数据:( 1 ≤ n ≤ 1 0 6 1 ≤ n ≤ 10^6 1n106

对于 100 % 100\% 100%的数据:( 1 ≤ n ≤ 1 0 9 1 ≤ n ≤ 10^9 1n109

Question Analysis:

通过数据规模可知,我们至少应该采用 O ( n ) O(n) O(n)以下时间复杂度的算法。
首先,我们令 i 为 公 鸡 的 数 目 j 为 母 鸡 的 数 目 k 为 小 鸡 的 数 目 i为公鸡的数目 \quad j为母鸡的数目 \quad k为小鸡的数目 ijk
我们枚举小鸡的数目,这样防止发生小鸡的数目不为可被三整除的情况
现在,我们有 4 4 4个变量 i , j , k , n i , j , k , n i,j,k,n
据题意,可以得到两个方程 i + j + k = n i+j+k=n i+j+k=n 5 × i + 3 × j + k ÷ 3 × 1 = n 5×i+3×j+k÷3×1=n 5×i+3×j+k÷3×1=n
据上述两方程可解
i = 4 k 3 − n i=\frac{4k}{3}-n i=34kn
j = 2 n − 7 k 3 j=2n- \frac{7k}{3} j=2n37k

Code:

C++:

#include<iostream>
using namespace std;
int n,res=0;
int main()
{
    cin >> n;
    int i,j,k;//i:公鸡的数目	j:母鸡的数目	k:小鸡的数目
    //枚举小鸡的数目
    for(k=0;k<=n;k=k+3)
    {
    	i=(4*k)/3-n;
    	j=2*n-(7*k)/3;
    	if(5*i+3*j+k/3==n&&i>=0&&j>=0) //注意,i,j可能为负,所以需要特判
    		res++;
	}
    cout << res << endl;
}

Python(3.x):

res=0
n=int(input())
k=0
while(k<=n):
    i=(4*k)//3-n
    j=2*n-(7*k)//3
    if 5*i+3*j+k//3==n and i>=0 and j>=0:
        res=res+1
    k=k+3
print(res)

有时候最简单的方法没准是最好的方法

欢迎大家留下其他算法的代码


如有疑问欢迎在评论区留言或者通过Email联系我

My Email:Wizzy-Ang@qq.com

欢迎大家关注我的个人公众号WizzyAngShare,(还有个人博客)

我会在这里分享编程语言语法,算法,及区块链的相关知识,还有各种奇奇怪怪的小知识等着你~

QRCode
虽然现在这个公众号有亿点草率 ,我会努力更新的~~~

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值