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

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

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

目录

一丶合法日期

二丶古堡算式

三丶估计人数

四丶蓝跳跳

五丶乘积最大


一丶合法日期

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

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

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

#include 
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
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;
}

三丶估计人数

题目链接:找人数

题目要求:

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

解题思路:

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

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

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

#include
#include
#include

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的滑稽_ωノ

四丶蓝跳跳

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

题目要求:

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

解题思路:

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

五丶乘积最大

题目链接:大大大

题目要求:

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

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

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

解题思路:

dp,寄!

你可能感兴趣的:(31日打卡,学习,算法,蓝桥杯,数据结构,c++)