深圳幻海软件技术有限公司 欢迎您!

蓝桥杯刷题第二十天

2023-04-14

第一题:纸张尺寸问题描述在ISO国际标准中定义了A0纸张的大小为1189mm×841mm,将A0纸沿长边对折后为A1纸,大小为841mm×594mm,在对折的过程中长度直接取下整(实际裁剪时可能有损耗)。将A1纸沿长边对折后为A2纸,依此类推。输入纸张的名称,请输出纸张的大小。输入格式输入一行包含一

第一题:纸张尺寸

问题描述
在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm ×841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm × 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。
输入纸张的名称, 请输出纸张的大小。
输入格式
输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。
输出格式
输出两行,每行包含一个整数,依次表示长边和短边的长度。

样例输入 2

A1

样例输出 2

  1. 841
  2. 594

就是模拟,每次除二向下取整 floor

始终保存a > b即可

  1. #include<iostream>
  2. #include<math.h>
  3. using namespace std;
  4. int main(){
  5. char op[2];
  6. cin>>op;
  7. double a = 1189, b = 841;
  8. int n = op[1] - '0';
  9. for(int i = 0; i < n; i++){
  10. a = floor(a / 2);
  11. if(a < b){
  12. int t = a;
  13. a = b;
  14. b = t;
  15. }
  16. }
  17. // cout<<floor(1.1)<<endl; //向下取整
  18. // cout<<ceil(1.1)<<endl; //向上取整
  19. // cout<<round(1.1)<<endl; //四舍五入
  20. cout<<int(a)<<endl<<int(b)<<endl;
  21. return 0;
  22. }

第二题:最大数字

问题描述
给定一个正整数 N 。你可以对 N 的任意一位数字执行任意次以下 2 种操 作:
将该位数字加 1 。如果该位数字已经是 9 , 加 1 之后变成 0 。
将该位数字减 1 。如果该位数字已经是 0 , 减 1 之后变成 9 。
你现在总共可以执行 1 号操作不超过 A 次, 2 号操作不超过 B 次。 请问你最大可以将 N 变成多少?
输入格式
第一行包含 3 个整数: N,A,B
输出格式
一个整数代表答案
对于 30% 的数据,1≤N≤100;0≤A,B≤10。
对于 100% 的数据, 1≤N≤10 17 ;0≤A,B≤100

样例输入

123 1 2

样例输出

933

dfs, 从高位到低位考虑每个位置

高位能变大,就使用操作尽可能变大,所得到的数就能最大

记得回溯,还有数据范围

  1. #include<iostream>
  2. using namespace std;
  3. typedef long long LL;
  4. string str;
  5. int n, m;
  6. LL ans = 0;
  7. void dfs(int i, LL v){
  8. //考虑每个位置
  9. int x = str[i] - '0';
  10. if(str[i]){
  11. //操作1的 操作次数
  12. int t = min(n, 9 - x);
  13. n -= t;
  14. dfs(i + 1, v * 10 + x + t);
  15. //回溯
  16. n += t;
  17. //考虑操作2 是否可以
  18. if(m > x){
  19. m -= x + 1;
  20. dfs(i + 1, v * 10 + 9);
  21. //回溯
  22. m += x + 1;
  23. }
  24. }
  25. else
  26. ans = max(ans, v);
  27. }
  28. int main(){
  29. cin>>str>>n>>m;
  30. dfs(0, 0);
  31. cout<<ans<<endl;
  32. return 0;
  33. }

第三题:全排列的价值

全排列的价值 - 蓝桥云课 (lanqiao.cn)

推公式,数学问题

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. using ll = long long;
  4. const ll mod = 998244353;
  5. int main () {
  6. ll n; cin >> n;
  7. ll ans = 1;
  8. //计算 阶乘除以2
  9. for(int i = 3; i <= n; i++) {//从3开始是因为在这一步直接将2除掉了, 避免除法
  10. ans = (ans * i) % mod;
  11. }
  12. //乘以C(2, n)
  13. ans = (ans * ((n * (n - 1) / 2) % mod)) % mod;
  14. cout << ans << endl;
  15. return 0;
  16. }
文章知识点与官方知识档案匹配,可进一步学习相关知识
算法技能树首页概览44032 人正在系统学习中