欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

算法作业 - 鸡和兔

最编程 2024-07-12 13:33:35
...

      难得呀,学院居然开了ACM-ICPC的算法培训课,真是罕见。老师是真的令我不爽,不过教的还行。今天第一道题是鸡兔同笼的变式,题目如下

 

 

 

 

 

签到题难度可能都没有,蓝桥杯的签到题还差不多,好,开始分析题目。

粗略的扫了一下题目发,概括一下题目:知道腿数a,求最多有几只动物,最少有几只动物。嗯,很简单。脑子里第一反应是及其暴力的双重循环然,

贴一下第一反应的代码(虽然说很蠢,但总能得出一个正确结果吧):

//循环才是王道(手动滑稽)
bool
sumflag = false; for (int i = 1; i < a/2; i++) { for (int j = 1; j < a/2; j++) { if (i*2+j*4 == a) { sumflag = true;//确认有符合类型 if (max < i+j)//记录最小动物数 { max = i + j; } if (min > i+j)//记录最大动物数 { min = i+j; } } } } if (!sumflag) { printf("0 0\n"); } else { print("%d %d", max, min); } //看看就好看了,太暴力le

但是,太暴力了,所以开动脑筋想了想,嗯,什么时候动物数最多呢???,嗯,鸡只有两只腿,嗯~ o(* ̄▽ ̄*)o,腿少的动物越多,动物总数越多,嗯!所以,动物最少的情况类推就好了,所以核心代码出来了:

自己能写出来就不要看代码

#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdlib.h>
/**
 * @author 杨文蓁的小迷弟
 * @note   算法作业1 
 * @date   2019/08/25
 */
int main()
{
    int i, j, L, times, start, end, count;
    int a[10001] = {0};
    count = 0;
    while ( ~scanf( "%d%d",&L ,&times ) )
    {
        for ( i = 0; i < times ;i++ )
        {
            scanf( "%d%d",&start ,&end );
            for ( j = start; j <= end; j++ )
            {
                if ( 0 == a[j] )
                {
                    a[j] = 1;
                    count++;
                }
            }
        }
        printf( "%d\n", 1+L-count );
    }
    return 0;
}
int main()
{
    int times, legs;

    scanf("%d", &times);

    while (times--)
    {
        scanf("%d", &legs);

        if (0 == legs % 2)//先判断是不是偶数,只要奇数腿就直接0 0
        {
            if (0 == legs % 4)//特判可以被4整除的情况
            {
                printf("%d %d\n", legs / 4, legs / 2);
            }
            else//常例
            {
                printf("%d %d\n", (legs - 1) / 4 + 1, legs / 2);//自己摸索出来的向上取整((n-1)/4)+1
            }
        }
        else
        {
            printf("0 0\n");
        }
    }
    return 0;
}
C

 

 好了,算法艰辛,砥砺前行!