蓝桥杯真题31日冲刺国一 | 每日题解报告 第十九天

大噶好,我系泡泡,今天的题难度很高(我是fw

有能力的自己搞一下,省赛的同学今天就当放松一下

目录

一丶合法日期

二丶古堡算式

三丶估计人数

四丶蓝跳跳

五丶乘积最大


一丶合法日期

题目链接:肥肠简单的模拟题

题目要求:让你判断一个月份和天数在2021年存不存在

解题思路:直接if判断即可!

#include <iostream>
using namespace std;
int main()
{
  int n,m;
  cin>>n>>m;
  if(n>12||n<1)
  {
    cout<<"no";
    return 0;
  }
  if(n==1||n==3||n==5||n==7||n==8||n==10||n==12)
  {
    if(m<=31&&m>=1)
    {
      cout<<"yes";
      return 0;
    }
  }
  else if(n==2)
  {
    if(m<=28&&m>=1)
    {
      cout<<"yes";
      return 0;
    }
  }
  else
  {
    if(m<=30&&m>=1)
    {
      cout<<"yes";
      return 0;
    }
  }
  cout<<"no";
  return 0;
}

二丶古堡算式

题目链接:福尔摩斯与花生的爱恨情仇

题目要求:

福尔摩斯到某古堡探险,看到门上写着一个奇怪的算式:

ABCDE ∗ ?=EDCBA

他对华生说:“ABCDE 应该代表不同的数字,问号也代表某个数字!”

华生:“我猜也是!”

于是,两人沉默了好久,还是没有算出合适的结果来。

请你利用计算机的优势,找到破解的答案。

把 ABCDE 所代表的数字写出来。

解题思路:

五个循环就可以解决这个问题,枚举每一个数字,如果他们不同就进入相乘的过程,定义两个变量,第一个存abcde,第二个edcba,如果abcde%edcba为0那么输出!!(福尔摩斯有这么笨吗

#include<stdio.h>
int main()
{
	int a,b,c,d,e,num1,num2;
	for(a=1;a<10;a++)
	{
		for(b=0;b<10;b++)
		{
			for(c=0;c<10;c++)
			{
				for(d=0;d<10;d++)
				{
					for(e=1;e<10;e++)
					{
						if(a!=b && a!=c && a!=d && a!=e && b!=c && b!=d && b!=e && c!=d && c!=e && d!=e)
						{
							num1=e+d*10+c*100+b*1000+a*10000;
							num2=a+b*10+c*100+d*1000+e*10000;
							if(num2%num1==0)
							{
								printf("%d",num1);
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

三丶估计人数

题目链接:找人数

题目要求:

解题思路:

二分图或者匈牙利或者bfs判断(这个数据不大所以爆可以,群里的怂佬爆的,不过他是java

或者最短路啥的都能过不过俺实在是不会,不过我找了一个大佬的二分图题解来给大家欣赏一下,

这是国赛题,一般也没这么难得我感觉,需要的大佬可看看

#include<cstdio>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 410, M = 100010, K = 22, INF = 0x3f3f3f3f;

int h[N], e[M], f[M], ne[M], idx;
void add(int a, int b, int c)
{
    e[idx] = b, f[idx] = c, ne[idx] = h[a], h[a] = idx ++;
    e[idx] = a, f[idx] = 0, ne[idx] = h[b], h[b] = idx ++;
}

int n, m, S, T;
int hs[N], d[N], q[N];
bool bfs()
{
    memset(d, -1, sizeof d);
    d[S] = 0;

    int hh = 0, tt = -1;
    q[ ++ tt] = S;
    hs[S] = h[S];

    while(hh <= tt)
    {
        int u = q[hh ++];

        for(int i = h[u]; ~i; i = ne[i])
        {
            int j = e[i];
            if(d[j] == -1 and f[i])
            {
                d[j] = d[u] + 1;
                hs[j] = h[j];
                if(j == T)  return true;
                q[ ++ tt] = j;
            }
        }
    }
    return false;
}

int find(int u, int limit)
{
    if(u == T)  return limit;

    int flow = 0;
    for(int i = hs[u]; ~i and flow < limit; i = ne[i])
    {
        hs[u] = i;
        int j = e[i];
        if(d[j] == d[u] + 1 and f[i])
        {
            int t = find(j, min(f[i], limit - flow));
            if(!t)  d[j] = -1;
            f[i] -= t, f[i ^ 1] += t, flow += t;
        }
    }
    return flow;
}

int dinic()
{
    int res = 0, flow;
    while(bfs())  while(flow = find(S, INF))  res += flow;
    return res;
}

char s[K][K];
int num[K][K];
int g[N][N];

int main()
{
    memset(h, -1, sizeof h);

    int n, m;
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n; i ++)  scanf("%s", s[i] + 1);

    S = N - 2, T = N - 1;
    int cnt = 0;
    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            if(s[i][j] == '1')
                num[i][j] = ++ cnt;

    for(int i = 1; i <= n; i ++)
        for(int j = 1; j <= m; j ++)
            if(num[i][j])
            {
                int a = num[i][j];
                add(S, a, 1);
                add(cnt + a, T, 1);

                int b = num[i + 1][j];
                if(a)  g[a][b] = true;
                b = num[i][j + 1];
                if(b)  g[a][b] = true;
            }

    for(int k = 1; k <= cnt; k ++)
        for(int i = 1; i <= cnt; i ++)
            for(int j = 1; j <= cnt; j ++)
                if(g[i][k] and g[k][j])  g[i][j] = true;

    for(int i = 1; i <= cnt; i ++)
        for(int j = 1; j <= cnt; j ++)
            if(g[i][j])
                add(i, cnt + j, 1);

    printf("%d\n", cnt - dinic());
    return 0;
}

题解大佬是来自acwing的滑稽_ωノ

四丶蓝跳跳

题目链接:蓝跳跳(杀人啦

题目要求:

解题思路:

这题直接跳过 太难了 A组国赛题(执佬太杀我了

五丶乘积最大

题目链接:大大大

题目要求:

 给定N个整数A1, A2, ... AN。请你从中选出K个数,使其乘积最大。

 请你求出最大的乘积,由于乘积可能超出整型范围,你只需输出乘积除以1000000009的余数。

 注意,如果X<0, 我们定义X除以1000000009的余数是负(-X)除以1000000009的余数。
 即:0-((0-x) % 1000000009)

解题思路:

dp,寄!

蓝桥杯是一个国内著名的计算机比赛,为了帮助参赛者更好地准备和了解比赛的题型,组委会会公布历年的真题并提供相应的题解。 首先,我们需要了解蓝桥杯是一个综合性的计算机比赛,测试的对象包括计算机基础知识、编程能力以及解决实际问题的能力。 在历年的真题中,参赛者将面临不同类型的题目,包括算法设计与优化问题、数据结构算法问题、编程题等。其中针对Python B组的题目主要考察的是对Python语言的掌握和应用能力。 题目解答一般会包含以下几个方面的内容: 1. 题目分析与理解:读取题目,理解题目的要求和限制条件。通过仔细分析题目,确定题目的输入与输出,以及问题的核心。 2. 设计解决方案:根据题目要求和限制条件,设计一个合适的解决方案。可以使用合适的算法数据结构来解决问题,并做出相应的性能优化。 3. 编写代码实现:根据设计的方案编写相应的代码实现。需要注意的是,Python语言有其独特的语法和特性,掌握好这些特性可以更好地完成编程任务。 4. 调试与测试:编写完代码后,需要进行调试和测试。通过运行样例输入和输出,检查代码是否符合题目要求,并且没有逻辑上的错误。 5. 总结与优化:在完成题目解答后,可以进行总结和优化。包括分析算法复杂度、代码风格和可读性等方面,以便在比赛中更好地表现。 在准备蓝桥杯时,可以通过阅读历年的真题和题解来了解比赛的难度和类型,针对性地进行练习和提高。同时也可以参加相关的培训班和讨论活动,与其他参赛者交流经验和技巧。 总而言之,历年蓝桥杯真题的解答对于提高自己的编程能力和应对比赛非常有帮助。通过认真分析和实践,可以更好地理解并掌握Python编程,并在比赛中取得更好的成绩。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cloud、泡泡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值