蓝桥杯比赛题目


第二场的蓝桥杯确实感觉比第一场的简单多了,整体的感觉不难

emm,准备了一天,能做的都做了

记录一下给自己的粗心买单

A 双阶乘

5分

59375

先模在乘 C++ 这样才能不溢出

听说有同学直接用Python 做这种大数处理的

#include<iostream>
using namespace std;
typedef long long LL;
int main()
{
int ans = 1;
for(ll i = 1;i <= 2021; i += 2) {
ans = (ans * i) % mod;
cout<<ans<<endl;
}
cout<<ans<<endl;
return 0;
}

/*
ans = 59375
*/

B 格点

答案15698 比较简单

限制条件:X>0,Y>0 且为整数

X*Y<=2021

#include<algorithm>
#include<iostream>
using namespace std;
#define ll long long
#define mod 100000;

int main()
{
int ans = 0;
for(int i = 1;i <= 2021; ++i) {
for(int j = 1;j <= 2021; ++j) {
if(i * j <= 2021) ans ++;
}
}
cout<<ans<<endl;
return 0;
}
/*
ans = 15698
*/

C 整数分解:

可惜了,做这道题的时候,很急,以为很简单 不想花太多时间

直接手写了5个For 后面修剪的时候太难受了

当时想到了一点,就是其实不用考虑五个数,只考虑一个数

但是思路 局限在修剪五次循环遍历

妙呀

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<iostream>
#define ll long long
#define mod 100000
using namespace std;

map<string,bool> vis;

int main()
{
ll ans = 0;
int n = 2021;
for(int i = 1;i < n; ++i) {
for(int j = 1;j < n; ++j) {
for(int k = 1;k < n; ++k) {
int m = 2021 - i - j - k;
if(m <= 1) break;
ans += m - 1;
}
}
}
printf("%lld\n",ans);
return 0;
}

/*
ans = 691677274345
*/

D 城邦

其实感觉这个是一个图的题目,没想到这个是最小生成树

答案:4046

我的思路是 每次只考虑最近的一个城市建桥

算出了202*55+1=11111

解题思路

很明显我们将2021个点两两之间的边的权值算出来,然后跑一下最小生成树即可

#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
#include<map>
#include<iostream>
#define ll long long
using namespace std;

const int N = 5e6;

struct Node {
int u,v,w;
Node(int u,int v,int w) {
this->u = u;
this->v = v;
this->w = w;
}
};
vector<Node> V;

bool cmp(Node l,Node r) {
return l.w < r.w;
}

int fa[5000];
int num = 2021;

void init() {
for(int i = 1;i <= 2077; ++i) fa[i] = i;
}

inline int f(int l,int r) {
vector<int> L,R;
while(l) {
L.push_back(l % 10);
l /= 10;
}
while(r) {
R.push_back(r % 10);
r /= 10;
}
int llen = L.size();
int rlen = R.size();
int ans = 0;
if(llen > rlen) {
for(int i = 0;i < rlen; ++i) {
if(L[i] != R[i]) ans += L[i] + R[i];
}
for(int i = rlen; i < llen; ++i) ans += L[i];
}
else {
for(int i = 0;i < llen; ++i) {
if(L[i] != R[i]) ans += L[i] + R[i];
}
for(int i = llen; i < rlen; ++i) ans += R[i];
}
return ans;
}

inline int find(int x) {
int t = x;
while(t != fa[t]) t = fa[t];
while(x != fa[x]) {
int temp = fa[x];
fa[x] = t;
x = temp;
}
return x;
}

ll kruskal() {
ll ans = 0;
int len = V.size();
for(int i = 0;i < len; ++i) {
int u = V[i].u;
int v = V[i].v;
u = find(u);
v = find(v);
if(u == v) continue;
fa[v] = u;
// num--;
ans += V[i].w;
}
return ans;
}


int main()
{
for(int i = 1;i <= 2021; ++i) {
for(int j = i;j <= 2021 ; ++j) {
if(i != j) {
int k = f(i,j);
V.push_back({i,j,k});
// printf("i = %d\tj=%d\tk = %d\n",i,j,k);
}
}
}
sort(V.begin(),V.end(),cmp);
init();
ll ans = kruskal();
cout<<ans<<endl;
// cout<<num<<endl;
return 0;
}

/*
ans = 4046
*/

E 游戏

与公约数的有关,算不出来

大题FGHIJ