第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0

2024-04-06 06:04

本文主要是介绍第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A立方和

#include<iostream>
#include<cmath>
using namespace std;
int main(){int n, t, flag, x;long long ans = 0;for(int i = 1; i <= 2019; i++){t = i;flag = 0;while(t && !flag){x = t % 10;if(x == 2 || x == 0 || x == 1 || x == 9) flag = 1;t /= 10;}if(flag) ans += (long long)pow(i, 3);}printf("%lld", ans);//4097482414389return 0;
}

打卡题

B字串数字

#include<iostream>
#include<string>
using namespace std;
int main(){string s = "LANQIAO";
//	string s = "LQ";long long power = 1, ans = 0;for(int i = s.size() - 1; i >= 0; i--){ans += (s[i] - 'A' + 1) * power;power *= 26;}printf("%lld", ans);//3725573269return 0;
}

进制转换

C质数

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
bool isPrime(ll n){ll sqr = sqrt(n);for(int i = 2; i <= sqr; i++){if(n % i == 0) return false;}return true;
}
int main(){ll x = 2, cnt = 0, ans;while(cnt < 2019){if(isPrime(x)){cnt++;ans = x;}x++;}printf("%lld", ans);//17569return 0;
}

类似于质数打表

D最短路

6
在这里插入图片描述


适当手算,灵活些

E RSA解密

没思路
尝试先把p,q试出来

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
int main(){ll n = 1001733993063167141LL, sqr = sqrt(n);for(ll i = 2; i <= sqr; i++){if(n % i == 0){printf("%lld ", i);if(i * i != n) printf("%lld ", n / i);}}return 0;
}

再试着把e试出来,但太大了不可行

#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
bool isPrime(ll n){ll sqr = sqrt(n);for(int i = 2; i <= sqr; i++){if(n % i == 0) return false;}return true;
}ll gcd(ll a, ll b){if(!b) return a;return gcd(b, a % b);
}
int main(){ll p = 891234941LL, q = 1123984201LL, d = 212353, e = 471730557631LL;if(isPrime(p)) cout << "p prime" << endl;if(isPrime(q)) cout << "q prime" << endl;cout << gcd((p-1)* (q-1), d) << endl;
//	cout <<  ((p-1)* (q-1) - 1) / d << endl;while((d * e) % ((p-1)* (q-1)) != 1){e++;}cout << e;return 0;
}

先鸽一下这题,后续有时间了用python算出来e再说

F 斐波那契额序列与黄金分割

先打印前一百个观察下数据,发现大于等于19后在保留八位小数的基础上就稳定在一个比值,符合提示的趋近于黄金分割。而且当数值过大时,比值会出现负数的情况,显然异常。考虑可能是因为斐波那契额数列增长速度过快,超出了int型范围。才100就超了,给定的n范围更超,索性利用后续在规定的精度内稳定于一个比值,直接打印不再计算。

#include<iostream>
using namespace std;
typedef long long ll;
int main(){ll f1 = 1, f2 = 1, f, n;for(int i = 3; i <= 100; i++){f = f1 + f2;printf("%d %.8f\n", i - 1, 1.0 * f2 / f);f1 = f2;f2 = f;}return 0;
}

在这里插入图片描述
在这里插入图片描述
提交程序为

#include<iostream>
using namespace std;
typedef long long ll;
int main(){ll f1 = 1, f2 = 1, f, n;scanf("%lld", &n);if(n > 20) printf("0.61803399");else{for(int i = 3; i <= n + 1; i++){f = f1 + f2;if(i == n + 1)printf("%.8f", 1.0 * f2 / f);f1 = f2;f2 = f;}}return 0;
}

一个测试点没过,忽略了n==2的情况

#include<iostream>
using namespace std;
typedef long long ll;
int main(){ll f1 = 1, f2 = 1, f, n;scanf("%lld", &n);if(n > 20) printf("0.61803399");else{for(int i = 2; i < n + 1; i++){f = f1 + f2;f1 = f2;f2 = f;}printf("%.8f", 1.0 * f1 / f2);}return 0;
}

G扫地机器人

不知道如何下手


走廊长度n为105,根据数据范围需要选择nlogn以内的算法。花费时间最短2,最长2*n,考虑二分处理。
在花费时间t内,判断是否能够扫完n个格子。用贪心,尽量让机器人扫其周围的格子且平均得划分。把机器人的位置升序排序,看机器人在时间t内,能够覆盖的右边界能否相互衔接上且最后一个机器人能够覆盖到走廊有边界。

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 10;
int a[maxn], n, k, l, r, mid;bool judge(int len){int r = 0;//上一个机器人能扫到的右边界for(int i = 0; i < k; i++){if(a[i] - len > r) return false;//不能衔接上,有覆盖不到的区域,则不可行else{if(a[i] < r) r = a[i] + len - 1;//在上一个机器人可覆盖的区域内else r += len;//在边界上 } }return r >= n; 
}int main(){scanf("%d%d", &n, &k);for(int i = 0; i < k; i++){scanf("%d", a + i);}sort(a, a + k);l = 0;r = n;while(l < r){mid = (l + r) / 2;if(judge(mid)) r = mid;//当前可行,尝试更短 else l = mid + 1;	//当前不可行,增加时间 }printf("%d", 2 * (l - 1)); return 0;
}

H修改数组

#include<iostream>
using namespace std;
const int maxn = 1e5 + 10, maxv = 1e6 + 1e5;
int a[maxn], flag[maxv] = {0};
int main(){int n;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", a + i);if(!flag[a[i]]) flag[a[i]] = 1;else {a[i] += flag[a[i]];while(flag[a[i]]) a[i]++;flag[a[i]]++;}}for(int i = 0; i < n; i++){printf("%d ", a[i]);}return 0;
}

两个测试点超时
没有充分利用flag的出现次数,还是一个个的跳且没有正确累加后续的出现次数

#include<iostream>
using namespace std;
const int maxn = 1e5 + 10, maxv = 1e6 + 1e5;
int a[maxn], flag[maxv] = {0};
int main(){int n, t;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", a + i);while(flag[a[i]]){t = a[i];a[i] += flag[t];flag[t]++;}flag[a[i]] = 1;}for(int i = 0; i < n; i++){printf("%d ", a[i]);}return 0;
}

I 灵能传输

#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 3e5 + 10;
int a[maxn];
int main(){int t, n, flag, x, p, temp;scanf("%d", &t);while(t--){scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", a + i);}flag = 1;while(flag){x = abs(a[0]);p = 0;for(int i = 1; i < n; i++){if(abs(a[i]) > x){x = abs(a[i]);p = i;}}if(x == 0) flag = 1;if(p == 0) p++;else if(p == n - 1) p--;temp = max(max(abs(a[p - 1] + a[p]), abs(a[p + 1] + a[p])), abs(a[p]));if(temp >= x) flag = 0;else{a[p - 1] += a[p];a[p + 1] += a[p];a[p] = -a[p];}}printf("%d\n", x);}return 0;
} 

骗了四个测试点的分。

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
typedef long long ll;
int main(){int n, t;scanf("%d", &t);while(t--){ll x, ansX = 0;scanf("%d", &n);vector<ll> sum(n + 1, 0);vector<ll> visit(n + 1, 0);vector<ll> ans(n + 1, 0); for(int i = 1; i <= n; i++){scanf("%lld", &x);sum[i] = sum[i - 1] + x;}ll l = sum[0], r = sum[n], lp = 0, rp = n, ansL = 0, ansR = n;//首位项的值if(l > r) swap(l, r);sort(sum.begin(), sum.end());for(int i = 0; i < n; i++){if(sum[i] == l){lp = i;break;}}for(int i = 0; i < n; i++){if(sum[i] == r){rp = i;break;}}for(int i = rp; i <= n; i += 2){//填充结果数组 ans[ansR--] = sum[i];visit[i] = 1; }for(int i = lp; i >= 0; i -= 2){ans[ansL++] = sum[i];visit[i] = 1;}for(int i = 0; i <= n; i++){if(!visit[i]) ans[ansL++] = sum[i];}for(int i = 1; i <= n; i++){if(abs(ans[i] - ans[i - 1]) > ansX) ansX = abs(ans[i] - ans[i - 1]);}printf("%lld\n", ansX);}return 0;
}

J空间跳跃

题干看起来好麻烦,蒟蒻不想做了

这篇关于第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/879185

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

C++ vector的常见用法超详细讲解

《C++vector的常见用法超详细讲解》:本文主要介绍C++vector的常见用法,包括C++中vector容器的定义、初始化方法、访问元素、常用函数及其时间复杂度,通过代码介绍的非常详细,... 目录1、vector的定义2、vector常用初始化方法1、使编程用花括号直接赋值2、使用圆括号赋值3、ve

如何高效移除C++关联容器中的元素

《如何高效移除C++关联容器中的元素》关联容器和顺序容器有着很大不同,关联容器中的元素是按照关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的,本文介绍了如何高效移除C+... 目录一、简介二、移除给定位置的元素三、移除与特定键值等价的元素四、移除满足特android定条件的元

Python获取C++中返回的char*字段的两种思路

《Python获取C++中返回的char*字段的两种思路》有时候需要获取C++函数中返回来的不定长的char*字符串,本文小编为大家找到了两种解决问题的思路,感兴趣的小伙伴可以跟随小编一起学习一下... 有时候需要获取C++函数中返回来的不定长的char*字符串,目前我找到两种解决问题的思路,具体实现如下:

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++