NOJ 1133 百钱百鸡问题

2016.10.10

【题目描述】
1133.百钱百鸡问题

时限:1000ms 内存限制:10000K 总时限:4000ms

描述
经典问题的描述如下:在市场上,鸡的售价分别是:公鸡3文钱1只,母鸡2文1只,小鸡1文3只。问拿100文钱想买100只鸡,则公鸡、母鸡和小鸡应各买多少只?

输入
本题无输入。
输出
输出所有解,每个解占一行,包含三个整数分别表示要买的公鸡、母鸡和小鸡的数量,用空格分隔。存在多组解的情况下,输出按升序排列(即0 0 1在0 1 0之前)。

【解题思路】
问题的实质就是三元一次方程的解,对于分数来说,可以在方程两边同乘分母化为整式方程。代码实现就是简单地枚举变量,考虑对每一种情况是否成立,这样时间复杂度是O(n3),做一个优化,对于正确解来说,只要公鸡和母鸡数量确定了,小鸡的数量也唯一确定,这样只需要枚举两层,时间复杂度降到了O(n2)。细节的优化可以确定枚举的上限什么的。

【代码实现】

# include <stdio.h>

int main(void)
{
    int i, j, k;

    for (i = 0; i <= 33; ++i)
        for (j = 0; j <= 50; ++j)
            if (9*i + 6*j + (100-i-j) == 300)
                printf("%d %d %d\n", i, j, 100-i-j);

    return 0;
}

【心得体会】
体会“降维”的思想,对于成立性问题,不必枚举每一种可能再去判断是否成立,可以利用成立条件倒推需要满足的等式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值