第十二届蓝桥杯省赛第二场C/C++B组题解
文章目录
拿到试题解压一看,就这?啪的一下A题直接提交1,传统功夫A题点到为止。这题不用优化,那题直接暴力求解,半个小时不到就到了J题,很快啊!回头一检查,这题效率达不到、这题看错题意,全部丢分了,我大意了啊,他说他是简单题,他可不是简单题,排列组合、质因数分解、prim、优先队列、回溯,看来是有备而来!我劝年轻人好自为之,好好反思,以后不要再犯这样的聪明,贪图一时快…武林要以和为贵,要细心读题,仔细码题,谢谢朋友们!
成绩出来了,三题填空,三题半大题,弱省省一中上,要是E题没有看错权重就省一头了呀
结果填空题
填空题答案一览
题目 | 答案 | 分值 |
---|---|---|
A: 求余 | 1 | 5 |
B: 双阶乘 | 59375 | 5 |
C: 格点 | 15698 | 10 |
D: 整数分解 | 691677274345 | 10 |
E: 城邦 | 4046 | 15 |
A: 求余
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
cout<< 2021%20 <<endl;
return 0;
}
//1
B: 双阶乘
分析:高位上的数字对结果没有影响,取余截掉
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int num = 1;
for(int i =2021;i>0;i-=2) num = (num * i) %1000000;
cout<< num % 100000 <<endl;
return 0;
}
//59375
C: 格点
分析: 根据题意,枚举所有可能符合的坐标,进行判断
代码:
#include <bits/stdc++.h>
using namespace std;
int main(){
int res = 0;
for(int i =1;i<=2030;i++){
for(int j =1;j<=2030;j++){
if(i * j <=2021) res++;
}
}
cout<< res <<endl;
return 0;
}
//15698
D: 整数分解
暴力+剪枝+排列组合(运行几分钟)
暴力枚举所有和为2021的五个正整数组合,再根据五个数的重复数排列组合
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main(){
long long res = 0;
int n =2021;
for(int a = 1;a<=500;a++){
for(int b = a;b<=1000;b++){
for(int c = b;c<=1500;c++){
for(int d = c;d<=2000;d++){
int e = n - a - b - c - d, t = 0;
if(e >= d){
//五个相等
if(a==e) t =1;
//四个相等
else if((a==d) || (b==e)) t =5;
//三个相等 + 两个相等
else if((a==c && d == e) || (a==b && c==e)) t =10;
//三个相等
else if((a==c) || (b==d) || (c==e)) t= 20;
//两对相等
else if((a==b && c==d) || (a==b && d==e) || (b==c && d ==e)) t= 30;
//一对相等
else if(a==b || b==c || c==d || d==e) t = 60;
//全不相等
else t = 120;
}
res += t;
}
}
}
}
cout<< res <<endl;
return 0;
}
//691677274345
三重循环(一两秒)
三重循环枚举三个数,差是m,和为m的两个正整数可能是m-1种
#include <bits/stdc+&#