赞
踩
蓝桥杯是OI赛制,也就是说即使不会算法,也可以暴力求解,拿到分数。
可以在电脑的编译器上使用超过时间的循环暴力求法,得出最终的答案,在选择题甚至可以使用excel求解。
对于大题,由于是OI赛制,OI赛制不同于ACM赛制的点是,OI赛制可以不用全对,但ACM赛制一定要求全对。
题目如下(示例):
给定一个长度为 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的时间复杂度,暴力出来。
代码如下(示例):
#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赛制,那么一分没有。
因此,我将其称之为——混分。在时间不够的情况下,可以这样混分。
空间换时间的方式:即增加空间复杂度以减少时间复杂度。
思考:
我们的核心在两重循环上,第一重循环是必须的,第二重循环我们需要思考一下如何优化,为何需要遍历全部变量呢?
我们需要的是,该数能互补(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月份左右
比赛时长:四个小时
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。