关于蓝桥杯

本文详细解析了蓝桥杯比赛中的几道典型题目,包括abcde / fghij = n的求解、有序数列的区间最大乘积、素数环的构造、李白打酒问题的算法以及奇怪的分式、六角填数、蚂蚁感冒和牌型种数的解题思路。通过实例和注意事项,阐述了解题过程中涉及的数学原理和编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

=====

abcde / fghij = n

题目:输入正整数n,按从小到大的顺序输出所有形如”abcde / fghij = n”的表达式,其中a~j恰好为0~9的一个排列,2<=n<=79.

样例输入:
61

62
样例输出:
There are no solutions for 61.

79546 / 01283 =62
94736 / 01528 =62

思路:因为比值n是确定的,所以只需对分母枚举,通过n求得分子,再判断分子分母是否符合提议。
注意:这里为什么不对分子枚举呢,是因为如果枚举分子,那么求分母时需要用到除法。int除以int求int是不准确的,但是int乘以int肯定是int(不溢出的情况下)。

#include<stdio.h>
#include<string.h>

int main()
{
    int n,fz,fm,s,t=0;
    int m[10]={
  0,1,2,3,4,5,6,7,8,9};
    int p[10];
    while(scanf("%d",&n)!=EOF&&n)
    {
        int flag=0;
        if(t++) printf("\n");
        for(fm=1234;fm<=49483;fm++)  //分母最大为49483是因为分子最大是98765,比值最小是2
        {
            fz=fm*n;  //通过分母和比值求出分子 
            if(fz<=98765)  //分子满足范围(分子肯定大于1234)
            {
                s=0;  //每次对分子匹配时,s都要初始化为0 
                /*得到组成分子分母的数字*/
                p[0]=fz/10000;
                p[1]=(fz/1000)%10;
                p[2]=(fz/100)%10;
                p[3]=(fz/10)%10;
                p[4]=fz%10;
                p[5]=fm/10000;
                p[6]=(fm/1000)%10;
                p[7]=(fm/100)%10;
                p[8]=(fm/10)%10;
                p[9]=fm%10;
                for(int i=0;i<10;i++)
                {
                    for(int j=0;j<10;j++)
                    {
                        if(p[j]==m[i])
                        {
                            s++;  //0~9的数字在p数组内出现,计数加一 
                            break;
                        }
                    }
                }
                if(s==10)  //0~9的数字都在p数组内出现,说明满足互不相等 
                {
                    flag=1;  //标志n有可以满足其的表达式 
                    printf("%05d / %05d = %d\n",fz,fm,n);
                }
            }
        }
        if(flag==0)  //若n没有可以满足其的表达式 
            printf("There are no solutions for %d.\n",n);
    }
}

=====

有序数列的区间最大乘积

题目:给定整数序列S = {S1,S2,…, 。 。 ,Sn},确定一个该序列内的区间,使区间内所有数相乘所得的s最大。若s不是一个正数,则s=0;

样例输入:
3
2 4 -3

5
2 5 -1 2 -1
样例输出:
Case #1: The maximum product is 8.

Case #2: The maximum product is 20.

思路:因为该集合S是一个序列,所以只需知道区间的起点与终点,就能确定区间。通过枚举起点与终点,不断把区间内所有数相乘的乘积,与s(初始值为0)进行大小的比较。若乘积大于s,则将乘积赋值给s。
注意:s初始值为什么是0呢?根据题意,若最大的区间乘积是负数,则s为0。当最大乘积为负数时,与s相比肯定是小于的,这样,最后要求得的s必然就是初始值0,符合题意。

#include<stdio.h>
int a[100],t=0;
int main()
{
    int n;
    long long int ss,s;  //ss是当前区间内所有数相乘的乘积,s是最大乘积 
    while(scanf("%d",&n)!=EOF&&n)
    {
        t++;
        s=0;
        for(int u=0;u<n;u+
关于蓝桥杯竞赛中的卖货问题,通常涉及算法和优化策略。这类问题的解决思路可以分为以下几个步骤: 1. **理解问题**:首先需要仔细阅读题目,理解问题的背景和要求。确定输入输出的格式,以及具体的限制条件。 2. **建模**:将问题转化为数学模型或图模型,明确问题的变量、约束条件和目标函数。 3. **选择算法**:根据问题的特点选择合适的算法。常见的选择包括动态规划、贪心算法、图算法(如最短路径算法、最小生成树算法)等。 4. **优化策略**:在选择算法的基础上,进一步优化策略。例如,使用记忆化搜索优化动态规划,使用堆优化贪心算法等。 5. **实现与测试**:将算法思路转化为代码,并进行充分的测试,确保代码的正确性和效率。 下面是一个具体的例子: **问题描述**:给定一个数组`prices`,其中`prices[i]`表示第`i`天的股票价格。设计一个算法计算你可以获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票),但不能同时参与多笔交易(即必须在再次购买前出售掉之前的股票)。 **解决思路**: 1. **理解问题**:我们需要计算在给定的股票价格序列中,通过多次买卖股票可以获取的最大利润。 2. **建模**:将问题转化为在价格序列中找到所有递增的子序列,并计算这些子序列的差值之和。 3. **选择算法**:可以使用贪心算法来解决这个问题。每次在价格上升时进行买卖。 4. **优化策略**:贪心算法本身已经是最优的策略,因为我们在价格上升的每一天都进行买卖。 5. **实现与测试**: ```python def max_profit(prices): if not prices: return 0 max_profit = 0 for i in range(1, len(prices)): if prices[i] > prices[i - 1]: max_profit += prices[i] - prices[i - 1] return max_profit # 测试 prices = [7,1,5,3,6,4] print(max_profit(prices)) # 输出: 7 ``` 在这个例子中,我们通过贪心算法在价格上升时进行买卖,最终计算出最大利润。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值