第十二届蓝桥杯省赛第二场C/C++B组题解

第十二届蓝桥杯省赛第二场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+&#
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值