蓝桥杯如何混分


蓝桥杯

蓝桥杯是OI赛制,也就是说即使不会算法,也可以暴力求解,拿到分数。


一、如何暴力求解

可以在电脑的编译器上使用超过时间的循环暴力求法,得出最终的答案,在选择题甚至可以使用excel求解。
对于大题,由于是OI赛制,OI赛制不同于ACM赛制的点是,OI赛制可以不用全对,但ACM赛制一定要求全对。

二、举例说明

1.蓝桥杯真题

题目如下(示例):
给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。

你可以从中选出两个数 Ai 和 Aj(i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。

例如 12 和 345 可以拼成 12345 或 34512。

注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai=Aj 时。

请你计算有多少种拼法满足拼出的整数是 K 的倍数。

输入格式
第一行包含 2 个整数 n 和 K。

第二行包含 n 个整数 A1,A2,⋅⋅⋅,An。

输出格式
一个整数代表答案。

数据范围

1≤n≤105,
1≤K≤105,
1≤Ai≤109

输入样例:

4 2
1 2 3 4

输出样例:

6

我们可以发现,这题如果不会做,我们可以暴力n^2的时间复杂度,暴力出来。

2.暴力代码

代码如下(示例):

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N = 1e5 + 10;

int xy[N],num[N];
long long cnt ;
int n , k ;
long long wei(int x)
{
    int num = 1 ;
    while(x)
    {
        x /= 10;
        num *= 10;
    }
    return num % k;
}

signed main()
{
    cin >> n >> k ;
    
    for(int i = 1 ; i <= n ; i ++ )  cin >> xy[i] , num[i] = wei(xy[i]) , xy[i] %= k ;
    
    for(int i = 1 ; i <= n ; i ++ )
    {
        for(int j = 1 ; j <= n ; j ++ )
        {
            if(j == i) continue;
            if((xy[i] * num[j] + xy[j]) % k == 0 )
            {
                cnt ++;
            }
            //cout << i << "  " << xy[i] << "  " << j <<"  " << xy[j]<< "   " << (xy[i] * num[j] + xy[j])%k << endl;
        }
    }
    
    cout << cnt << endl;
    return 0;
}

这个代码时间复杂度是n2的,而题目要求1s(根据经验:1s差不多极限不TLE的运算次数是1e8),因此该题如果n2的时间复杂度的话,必然会TLE,拿不到满分,但是由于是OI赛制,则可以拿分。如果是ACM赛制,那么一分没有。
因此,我将其称之为——混分。在时间不够的情况下,可以这样混分。

3.正解思路 + 代码

空间换时间的方式:即增加空间复杂度以减少时间复杂度。
思考:
我们的核心在两重循环上,第一重循环是必须的,第二重循环我们需要思考一下如何优化,为何需要遍历全部变量呢?
我们需要的是,该数能互补(a1+a2 % k = 0 ,则称a1与a2互补)的数的个数。
又因为k<= 1e5,所以可以将作为数组索引(如果过大,可以考虑离散化)

首先我们考虑
(x[i] *10^( ln(y[j]) + 1 )+ y[j]) % K == 0
我们的核心就是优化这个式子,我们上面暴力的方法是通过遍历数组得到这个式子,接下来,我们考虑通过初始化数组的方式(即通过增大空间复杂度的方式)进行优化。

尝试1:

x[i]用数组来存其值
即
cntt[1-max(x[i]%K)]存整个数组中的值---x[i]%k----的个数 
( 0 <=max(x[i]%k) <= K - 1) 

例如:

K = 3 
N = 5
a[1-5] = 1 , 2 , 0 , 1 , 2 
则
cntt[0] = 1;
cntt[1] = 2;
cntt[2] = 2;

在我们枚举 j的时候,我们发现,即使找到了最后对应的cntt[i]的个数,但是并不能找到cntt[i]是否的个数里是否包含了j
(1)有同学可能会想到使用等于判断不就行了,但是题目要求序号不同,假设出现,序号不同,但值相同的两项。就违背了题目的意思了,因此不能这样直接用等于进行判断。
(2)有同学可能会想到使用vector循环

经过多次尝试和实验


总结

蓝桥杯全国软件和信息技术专业人才大赛是由中华人民共和国工业和信息化部人才交流中心主办,国信蓝桥教育科技(北京)股份有限公司承办的计算机类学科竞赛。截至2022年2月,蓝桥杯全国软件和信息技术专业人才大赛已举办12届。
蓝桥杯介绍:
大赛分为个人赛、团队赛和艺术设计赛三个部分。本博客仅针对个人赛做一些简单介绍,应该注意的事项,以及我个人赛后的总结。

竞赛项目及面向的对象

1.JAVA软件开发
对象:具有正式全日制学籍并且符合相关科目报名要求的研究生、本科及高职高专学生(以报名时状态为准),以个人为单位进行比赛。该专业方向设大学A组、大学B组、大学C组。

说明:985、211本科生只能报大学A组,所有院校研究生只能报大学A组,其它院校本科生可自行选择报大学A组或大学B组,高职高专院校可报大学C组或自行选择报任意组别。

2.C/C++程序设计
对象:具有正式全日制学籍并且符合相关科目报名要求的研究生、本科生及高职高专学生(以报名时状态为准) ,以个人为单位进行比赛。该专业方向设大学A组、大学B组、大学C组。

说明:985、211本科生只能报大学A组,所有院校研究生只能报大学A组,其它院校本科生可自行选择报大学A组或大学B组,高职高专院校可报大学C组或自行选择报任意组别。

3.嵌入式设计与开发
对象:具有正式学籍的在校全日制研究生、本科及高职高专学生(以报名时状态为准),以个人为单位进行比赛。该专业方向设大学组。

4.单片机设计与开发
对象:具有正式学籍的在校全日制本科及高职高专学生(以报名时状态为准),以个人为单位进行比赛。该专业方向设大学组。

5.青少年创意编程组
对象:6-17岁的中小学生。

大赛规模
蓝桥杯分为省赛和决赛,在省赛中拿到省一等奖的选手才能晋级国赛(决赛),决赛一般在北京举行。

省赛时间:每年的3月份下旬到4月份上旬左右

国赛时间:每年的5月份左右

比赛时长:四个小时

  • 3
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
分糖果是一道经典的编程题目,常出现在编程竞赛中,比如蓝桥杯。题目描述如下: 给定一个长度为n的数组,表示n个小朋友的评分。现在需要将糖果分给这些小朋友,要求满足以下条件: 1. 每个小朋友至少分到一个糖果。 2. 评分更高的小朋友比他相邻的小朋友分到的糖果数量更多。 要求:计算最少需要多少个糖果才能满足以上条件。 解题思路: 1. 首先初始化一个长度为n的糖果数组,每个元素都为1,表示每个小朋友至少分到一个糖果。 2. 从左到右遍历评分数组,如果当前小朋友的评分比前一个小朋友高,则将当前小朋友的糖果数量设置为前一个小朋友的糖果数量加1。 3. 从右到左再遍历一次评分数组,如果当前小朋友的评分比后一个小朋友高,并且当前小朋友的糖果数量不大于后一个小朋友的糖果数量,则将当前小朋友的糖果数量设置为后一个小朋友的糖果数量加1。 4. 最后将糖果数组中所有元素的值相加,即为最少需要的糖果数量。 下面是分糖果问题的Python代码示例: ```python def minCandies(ratings): n = len(ratings) candies = * n for i in range(1, n): if ratings[i] > ratings[i-1]: candies[i] = candies[i-1] + 1 for i in range(n-2, -1, -1): if ratings[i] > ratings[i+1] and candies[i] <= candies[i+1]: candies[i] = candies[i+1] + 1 return sum(candies) # 测试样例 ratings = [1, 3, 2, 1, 2, 4, 3] result = minCandies(ratings) print(result) # 输出:12 ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

OrangeTaoer

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

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

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

打赏作者

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

抵扣说明:

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

余额充值