竞码编程-蓝桥杯校内选拔赛(决赛)重现赛 OI赛制 赛后试题自制详解(C/C++)
*最后几道太难了,能力有限,搬运大佬的
仅供备考学习使用,未进行任何商业活动~~~~~~*
**
A. 试题A:好运2020 8’
描述
JM同学2020想要行大运,所以他想知道,[1,2020]的数中有多少个好运数。对于好运数的定义为:如果x的不同质因子个数不等于4,则被认为是一个好运数。
例如:
数字4,其不同的质因子个数只有2,共1个,是一个好运数。
数字210,其不同的质因子分别是
2,3,5,7,共4个,则不是一个好运数。
请你帮JM同学计算一下,[1,2020]区间有多少个好运数,并提交答案。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个数字,填写多余的内容将无法得分。**
题解:
枚举[1,2000]中每一个数,逐一找出其不同质因子的个数。
质数判断题库P1020
答案:1937
代码实现:
#include <bits/stdc++.h>
using namespace std;
#define rep(i,l,r) for(int i=l;i<=r;i++)
int ans=0;
int sieve(int x){
int res=0;
rep(i,2,x){
if(x%i==0){
res++;
while(x%i==0)x/=i;
}
}
return res;
}
int main() {
rep(i,1,2020){
if(sieve(i)!=4)ans++;
}
cout<<ans;
}
B. 试题B:信息加密 8’
描述
古罗马时期,在大规模的战争中,部队之间常常需要信使往来,传递重要的军事情报。可是,一旦信使被敌军 抓获,重要的军事情报就完全暴露给了敌方。甚至,狡猾的敌人有可能篡改军事情报,并收买信使把假情报传递给我方部队。这样一来,我方部队就完全落入到了敌方的陷阱之中。
怎样防止这种情况的发生呢?不让信使被敌人抓获?这个肯定是无法绝对避免的。那么我们不妨换个角度,让敌人即使截获了军事情报,也看不懂里面的内容,这就是对信息的加密。
我们不妨这样来做这样的定义明文" ABCDEFGHIJKLMNOPQRSTUVWXYZ"其密文
是"JKLMNOPQRSTUVWXYZABCDEFGHI"。
请在给你一段密文请你通过我们使用的解密算法对密文进行解密
输入
第一行输入密文s(仅包含大写字母)
输出
输出对应明文
样例
输入
复制
ABC
输出
复制
RST
提示
数据规模
对于50%的数据,输入只包含A,B,C,D四种字母
对于100%的数据,
1 ≤len(s)≤10^5
题解:
每一个字母对应一个输出字母.
不会for循环遍历查找的同学,可以直接用组数自己预处理出每一个字母对应的输出字母
代码实现:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define I inline
#define ri register int
#define For(i , x , y) for(ri i = x ; i <= y ; ++ i)
#define Next(i , x) for(ri i = head[x] ; i ; i = e[i].nxt)
I int read() {
int s = 0 , w = 1; char ch = getchar();
while(ch < 48 || ch > 57) {
if(ch == '-') w = -1; ch = getchar();}
while(ch >= 48 && ch <= 57) s = (s << 1) + (s << 3) + (ch ^ 48) , ch = getchar();
return s * w;
}
const int N = 105;
string a , s = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" , t = "JKLMNOPQRSTUVWXYZABCDEFGHI";
char ans[N];
signed main() {
cin >> a;
For(i , 0 , 25) ans[t[i]] = s[i];
int len = a.length() - 1;
For(i , 0 , len) printf("%c" , ans[a[i]]) ; putchar('\n');
return 0;
}
C. 试题C:方圆 14’
描述
题解:
代码实现:
#include <iostream>
#include <cstring>
#include <map>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <set>
using namespace std;
int x, y, r;
int px, py, w, h;
int main(){
while(~scanf("%d%d%d", &x, &y, &r)){
scanf("%d%d%d%d", &px, &py, &w, &h);
int lx = px, rx = px + w;
int ly = py, ry = py + h;
//lx
double temp = sqrt(pow(r, 2) - pow(lx - x, 2));
if(temp >= 0){
double temp_y = y + temp;
if(ly <= temp_y && temp_y <= ry){
puts("yes");
continue;
}
temp_y = y - temp;
if(ly <= temp_y && temp_y <= ry){
puts("yes");
continue;
}
}
//rx
temp = sqrt(pow(r, 2) - pow(rx - x, 2));
if(temp >= 0){
double temp_y = y + temp;
if(ly <= temp_y && temp_y <= ry){
puts("yes");
continue;
}
temp_y = y - temp;
if(ly <= temp_y && temp_y <= ry){
puts("yes");
continue;
}
}
//ly
temp = sqrt(pow(r, 2) - pow(ly - y, 2));
if(temp >= 0){
double temp_x = x + temp;
if(lx <= temp_x && temp_x <= rx){
puts("yes");
continue;
}
temp_x = x - temp;
if(lx <= temp_x && temp_x <= rx){
puts("yes");
continue;
}
}
//ry
temp = sqrt(pow(r, 2