进阶训练赛(四)题解
A.交换a,b的值
直接输出b,a
void solve()
{int a,b;cin>>a>>b;cout<<b<<" "<<a;}
B.素数回文数的个数
从11~n遍历一遍找出满足即是回文数又是素数的数
bool isPalindrome(int n)//判断是否是回文数
{string s = to_string(n);int i=0,j = s.size()-1;while(i<j){if(s[i++]!=s[j--]) return false;}return true;
}bool isPrime(int n)//判断是否是素数
{if(n==1) return false;for(int i=2;i<=n/i;i++){if(n%i==0) return false;}return true;
}void solve()
{int n;cin>>n;int res = 0;for(int i=11;i<=n;i++){if(isPalindrome(i) && isPrime(i)) res++;}cout<<res;
}
C.机器翻译
利用队列实现,用一个vis数组记录内存中是否有某个单词,如果在不在内存内,查询次数+1,队首元素删除,将刚查询的元素入队,更新vis数组
bool vis[1000+10];//记录内存单词状态
void solve()
{int n,m;cin>>n>>m; queue<int>q;int res = 0;//查询次数while(m--){int e;cin>>e;if(!vis[e]){if(q.size()<n){q.push(e);}else{vis[q.front()] = false;q.pop();q.push(e);}res++;vis[e] = true;}}cout<<res;
}
D.素数对
先用素数筛将1~n的素数预处理出来,再遍历一遍预处理出来的素数表prime,相邻两个素数若相差2则输出
int prime[10000+10];
bool vis[10000+10];
int cnt;void get_prime(int n)//筛质数
{for(int i=2;i<=n;i++){if(!vis[i]){prime[cnt++] = i;for(int j=2*i;j<=n;j+=i) vis[j] = true;}}
}void solve()
{int n;cin>>n;get_prime(n);int res = 0;//记录素数对的个数for(int i=0;i<cnt-1;i++){if(prime[i+1]-prime[i]==2){res++;cout<<prime[i]<<" "<<prime[i+1]<<endl;}}if(res==0) cout<<"empty"<<endl;}
E.[蓝桥杯2022初赛] 特殊时间
直接纸上模拟比较方便。首先先从0~9中十个数字选则两个不同的数字,月份中至少包含一个0或一个1,所以选数字时至少选一个0或1。可以选择的数对为(0,1),(0,2)...(0,9),(1,2),(1,3)...(1,9)。
(0,1):3个1的情况:4*4*4 = 64(年份可排列数量*月份日期可排列数量*时间可排列数量)
3个0不满足月份日期
(0,2):3个2的情况 4*1*4 = 16
(0,3):3个3+1个0无法排列成正常月份日期
(0,4)~(0,9)情况均为0
(1,2): 3个1:4*3*4 = 48
3个2:4*1*4 = 16
(1,3):3个1:4*1*3 = 12(11月份最多到30日)
3个3开始情况均为0
(1,4):3个1:4*1*3 = 12
(1,5):3个1:4*1*3 = 12
(1,6)~(1,9):4*1*2 = 8
64+16+48+16+12*3+8*4 = 212
void solve()
{cout<<212;
}
F.[蓝桥杯2022初赛] 求和
利用前缀和数组计算
a[1]·a[2 ]+a[1]·a[3]+...+a[1]·a[n]转化为a[i]*(a[2]+a[3]+....a[n])
(a[2]+a[3]+....a[n])可以通过前缀和数组s[n]-s[1]得出
后面的项同理
#define int long long
int a[200000+10];//原始数组
int s[200000+10];//前缀和数组
void solve()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];s[i] = s[i-1]+a[i];}int res = 0;for(int i=1;i<=n-1;i++){res += (s[n]-s[i])*a[i];}cout<<res;
}
G: 剪切
长方形对半分面积为w*h/2
如果(x,y)在长方形对角线交点,则不止一种分割方法,否则,只有一种分割方法
void solve()
{double w,h,x,y;cin>>w>>h>>x>>y;printf("%.6lf ",w*h/2);if(abs(2*x-w)<1e-7 && abs(2*y-h)<1e-7) cout<<1;else cout<<0;}
H: 孙权点兵,多多乱点
遍历第2~n-1个,如果a[i]为a[i-1],a[i],a[i+1]三个数的中间数,结果数+1
void solve()
{int n;cin>>n;int a[n+10];int res = 0;fer(i,1,n) cin>>a[i];fer(i,2,n-1){ //for(int i=2;i<=n-1;i++)if( (a[i]<a[i-1] && a[i]>a[i+1]) || (a[i]>a[i-1] && a[i]<a[i+1]) ) res++;}cout<<res;
}
I: 许攸说
如果序列长度是奇数,无法将区间分成两个长度相等的子序列
如果序列长度是偶数,数据量为1e5,可以进行排序,排序后,从a[n/2]到a[n/2+1]的数字均为符合条件的耐力值k
int a[100000+10];
void solve()
{int n;cin>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);if(n&1) cout<<0<<endl;else{cout<<a[n/2+1]-a[n/2]<<endl;}
}
J: 借钱
数据量只有20,可以直接暴力查找对比,如果距离为整数,sqrt(dist)和(int)(sqrt(dist))会相等,否则不等
void solve()
{int n,d;cin>>n>>d;int res = 0;int a[n+10][d+10];for(int i=1;i<=n;i++){for(int j=1;j<=d;j++) cin>>a[i][j];}int i,j,k;for(i=1;i<=n;i++){for(j=i+1;j<=n;j++){double dist=0;for(k=1;k<=d;k++){dist += (a[i][k]-a[j][k])*(a[i][k]-a[j][k]);}//cout<<sqrt(dist)<<" "<<(int)(sqrt(dist))<<endl;if(sqrt(dist)==(int)(sqrt(dist))){res++;}}}cout<<res;
}
K.姜维摆七星灯
题意为相邻元素乘积 <= N的序列数
用dp做,推出状态转移方程:
数据是1e9级别的,暴力会TLE,而N/j的取值只有种情况,用整除分块的方法把答案相同的dp[i][j]合在一起,然后乘起来转移
OiWiki上有整除分块相关知识:https://oi-wiki.org/math/number-theory/sqrt-decomposition/
typedef long long ll;
#define PII pair <ll,ll>
const ll mod=1e9+7;
const int N = 100000+10;
ll n,m,k;
map<ll,ll> mp;
PII g[N+10];
ll dp[100][N+10];void solve()
{cin>>n>>k;for(ll l=1,r;l<=n;l=r+1){r=n/(n/l);g[++m]={r,r-l+1};mp[r] = m;}for(int i=1;i<=m;i++){dp[1][i]=(dp[1][i-1]+g[i].second)%mod;}for(int i=2;i<=k;i++){for(int j=1;j<=m;j++){dp[i][j]=(dp[i][j-1]+g[j].second*dp[i-1][mp[n/g[j].first]]%mod)%mod;}}cout<<dp[k][m];
}
L.汉寿亭侯
这个问题关键是两点:一个是将问题转换成小球放盒子(可重复),另一个是求组合数C(a,b)的算法。求组合数有多种方法,这里我用的是卢卡斯定理的模板,lucas(a,b)C(a,b)
设要将宝石分成t堆(1<=t<=k),将问题转化一下
1.先进行分组,利用插板法把k个小球分成t组
2.然后插入到n-k+1个间隔当中去
答案最终为:
#define mod 1000000007
#define int long long
int qmi(int a, int k, int p)
{int res = 1 % p;while (k){if (k & 1) res = (LL)res * a % p;a = (LL)a * a % p;k >>= 1;}return res;
}int C(int a, int b, int p) // 求组合数C(a, b)
{if (a < b) return 0;LL x = 1, y = 1; // x是分子,y是分母for (int i = a, j = 1; j <= b; i --, j ++ ){x = (LL)x * i % p;y = (LL) y * j % p;}return x * (LL)qmi(y, p - 2, p) % p;
}int lucas(LL a, LL b, int p)
{if (a < p && b < p) return C(a, b, p);return (LL)C(a % p, b % p, p) * lucas(a / p, b / p, p) % p;
}void solve()
{int n,k;cin>>n>>k;for(int i=1;i<=k;i++){int ans = lucas(n-k+1,i,mod)*lucas(k-1,i-1,mod)%mod;cout<<ans<<endl;}}
M.赵子龙七进七出
用bfs处理最小步数,邻接矩阵存储图,搜索的时候三次跳跃才算一步,所以需要开到二维数组来记录
queue<PII>q;
int vis[100000+10][3];
int dp[100000+10][3];
vector<int>g[100000+10];
int s,t;
int n,m;void bfs(){dp[s][0] = 0;vis[s][0] = 1;q.push({s,0});while(!q.empty()){auto t = q.front();q.pop();int tx = t.first;int ty = t.second;int y = (ty+1)%3;for(auto it:g[tx]){if(!vis[it][y]){dp[it][y] = dp[tx][ty]+1;q.push({it,y});vis[it][y] = 1;}}}
}void solve()
{cin>>n>>m;for(int i=1;i<=m;i++){int a,b;cin>>a>>b;g[a].push_back(b);}cin>>s>>t;bfs();if(!vis[t][0]) cout<<-1<<endl;else cout<<dp[t][0]/3<<endl;
}
进阶训练赛(四)题解相关推荐
- 蓝桥杯2020年第十一届C/C++B组(第二次)省赛习题题解
目录 试题A.门牌制作(拆分数字) 试题 B 既约分数(gcd) 试题C 蛇形填数(数学) 试题D 跑步锻炼(模拟) 试题E 七段码(图论+并查集) 试题F:成绩统计(格式化输出) 试题G:回文日期( ...
- buctoj-寒假集训进阶训练赛(二十二)
问题 A: Stones 题目描述 由于自行车状态错误,森普尔开始每天早上从东到西走,每天晚上走回去.走路可能会有点累,所以森普这次总是玩一些游戏. 路上有很多石头,当他遇到一块石头时,如果是他遇到的 ...
- 2023年福建农林大学程序设计校赛个人题解(无D解析)
2023年福建农林大学程序设计校赛个人题解(无D解析) A-这是一道原题 问题解析 从绿色材料合成到金色材料. 用 w h i l e while while 循环判断材料数是否能合成,能就合,合成后 ...
- 科林明伦杯哈理工第十届同步赛部分题解
科林明伦杯哈理工第十届同步赛部分题解 B题 搭积木问题 F题 三角形 B题 搭积木问题 链接:https://ac.nowcoder.com/acm/contest/5758/B 来源:牛客网 题目描 ...
- 19级爪哇程序设计新手赛(题解)
19级爪哇程序设计新手赛(题解) A.1+1 HDU - 1228 kk的英语作业,有两个小于100的正整数A和B,计算A+B. A和B由对应的英文单词给出. Input 测试输入包含若干测试用例,每 ...
- 2021第十二届蓝桥杯Python组国赛/决赛 题解
2021第十二届蓝桥杯Python组国赛/决赛 题解 前言 2021年第十二届蓝桥杯国赛/决赛,因为疫情原因没有像往年一样前往北京参赛,而是在自己学校的机房进行考试,形式上类似蓝桥杯省赛,但由于参加国 ...
- 蓝桥杯2022web省赛赛题题解-05
蓝桥杯2022web省赛赛题题解-05 完整代码见GitHub:github.com/Veilhry/lanqiaoweb/tree/master/05 冬奥会大抽奖 介绍 蓝桥云课庆冬奥需要举行一次 ...
- XMU区域赛选拔赛题解
XMU区域赛选拔赛题解 B.是谁打了奶奶 Description 最近发生了一起骇人听闻的打奶奶事件,凶手就是--惊奇队长. 惊奇队长是在电车上打的奶奶,那么我们就来看一个和电车有关的问题. 某市修建 ...
- 第十四届蓝桥杯cb组省赛个人题解
试题 C: 冶炼金属 时间限制: 1.0s 内存限制: 256.0MB 本题总分:10 分 [问题描述] 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X.这个 炉子有一个称作 ...
最新文章
- MSDynamicsAX2009成本处理与重估(中文)
- python如何获取多个excel单元格的值
- 独家干货 | 吴恩达深度学习专项课程精炼笔记!
- 为数据赋能:腾讯TDSQL分布式金融级数据库前沿技术
- java集合——集合与数组间的转换+算法
- 5.深度学习练习:Deep Neural Network for Image Classification: Application
- python中df占位符_PYTHON 中的%s %占位符用法
- membership配置数据库(SQL2000)
- 面试中的字符串问题 (1)
- matlab讨厌python_MATLAB在逐渐被Python淘汰吗?
- 射频电路设计——传输线理论(Transmission Line Analysis) 【上】
- 余世维+金正昆+陈安之+曾仕强+张锦贵等资料集
- Unity中扫描二维码将电脑照片保存在手机中
- 曾经排名第一的安全软件,为啥会变成流氓软件?
- 40000字 Matplotlib 实操干货,真的全!
- linux red hat 8.0 root密码破解
- 【Benewake(北醒) 】短距 TFmini Plus 12m介绍以及资料整理
- 小事认真,大事才会卓越
- springboot controller 中新建一个控制器类 提示该类从未被使用
- 多节点分布式监控 打造全新信息化港口——大连港集团有限公司