2022-1-17 每日一题 NewCoder KY156 百鸡问题

题目描述:


链接:https://www.nowcoder.com/practice/01d161052db64c249a47fc723b4fd5db

解题思路:

解法1:菜鸟版

x,y,z对应三重循环,根据n值 设置上限,条件满足 100只,并且总金额<=n

知识点总结:

1.对小数的处理:

  • 等式两边同时 乘以3(消除小数)推荐
  • 或者使用 1.0/31/3.0 强转为浮点型(保留小数后几位)

代码如下:

#include<iostream>
#include<cstdio>

using namespace std;

int main()
{
    int n;
    while(cin >> n){
        for(int x = 0; x <= n / 5; ++x)
            for(int y = 0; y <= n / 3; ++y)
                for(int z = 0; z <= n * 3; ++z){
                    if(x + y + z == 100 && 15 * x + 9 * y + z <= 3 * n){
                        printf("x=%d,y=%d,z=%d\n", x, y, z);
                    }
                }
    }
    return 0;
}

解法2:更优解法

优化代码总结:

1.减少嵌套循环:使用x,y计算z值,即z=100-x-y
注意:z为非负数,所以注意x,y循环上限!!!
2.适当缩小循环次数

代码如下:

#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int n,x,y,z;
    while(scanf("%d",&n)!=EOF)
    {
        for(x=0; x<=n/5; x++){//x上限可以为n/5
            for(y=0; y<=100-x; y++){//y上限只能由100-x表示
                z=100-x-y;//注意:z为非负数!!!所以此时z最小为0,即y=100-x,z=y-y=0
                if(x*5 + y*3 + z/3.0 <= n)
                    printf("x=%d,y=%d,z=%d\n",x,y,z);
            }
        }
    }
    return 0;
}
posted @ 2022-01-17 23:58  Jane8  阅读(61)  评论(0)    收藏  举报