第十五届蓝桥杯C/C++学B组(解)

打印 上一主题 下一主题

主题 1593|帖子 1593|积分 4779

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.握手问题


解题思路一

数学方法
50个人互相握手 (49+1)*49/2   ,减去7个人没有互相握手(6+1)*6/2
答案:1024
解题思路二

  1. package 十五届;
  2. public class Min {
  3.     public static void main(String[] args) {
  4.         int ans = 0;
  5.         for (int i = 1; i <= 50; i++) {
  6.             for (int j = i+1; j <= 50; j++) {
  7.                 //排除掉7人的情况
  8.                 if(!(i>=1&&i<=7 && j>=1&&j<=7)){
  9.                     ans++;
  10.                 }
  11.             }
  12.         }
  13.         System.out.println(ans);
  14.     }
  15. }
复制代码
 2.小球反弹



解题思路:

针对进步的方向举行分解为x,y方向,去求解运动返回到左上角的时间,有了时间,即可使用时间来计算总路程,假设 x方向走了p个来回,y方向走了q个来回,颠末了时间t,小球第一次回到原点
则时间*速率=路程  t*dx = 2px ,t*dy = 2qy,令一式/二式,得p/q= y/x*dx/dy = y*dx/x*dy ,使用gcd(求两个数的最大公约数)对分式p,q举行约分,进而得到约分后的p,q 则使用时间t=2px/dx,总路程 = t*(sqrt(15^2+17^2))

  1. package 十五届;
  2. import static java.lang.Math.sqrt;
  3. public class 小球反弹 {
  4.     public static void main(String[] args) {
  5.         int x = 343720;
  6.         int y = 233333;
  7.         int dx = 15;
  8.         int dy = 17;
  9.         int p = y * dx;
  10.         int q = x * dy;
  11.         int g = gcd(p, q);
  12.         p /= g;
  13.         q /= g;
  14.         int t = 2 * p * x / dx;
  15.         double ans = t * sqrt(15 * 15 + 17 * 17);
  16.         //d答案输出两位小数
  17.         System.out.printf("%.2f", ans);
  18.     }
  19.     public static int gcd(int a, int b) {
  20.         return b == 0 ? a : gcd(b, a % b);
  21.     }
  22. }
复制代码
答案:1100325199.77
3.好数

解题思路
 首先扫撤除末位数,可以优化复杂度,满足条件后 在进一步检查偶数位是否为偶数,奇数位是否为奇数
  1. package 十五届;
  2. import java.util.Scanner;
  3. public class 好数 {
  4.     public static void main(String[] args) {
  5.         Scanner scanner = new Scanner(System.in);
  6.         int n = scanner.nextInt();
  7.         int ans = 0;
  8.         for (int i = 1; i <= n; i++) {
  9.             //局部优化:过滤数值结尾不符合条件的情况
  10.             if (i % 10 % 2 == 0) continue;
  11.             if (check(i)) ans++;//判断是否为好数
  12.         }
  13.         System.out.println(ans);
  14.     }
  15.     //检查x是否为好数
  16.     public static boolean check(int x) {
  17.         int cnt = 1; //记录位数
  18.         while (x > 0) {
  19.             int b = x % 10;
  20.             if (cnt % 2 == 1) {//是奇数位并且不是奇数
  21.                 if (b % 2 != 1) return false;
  22.             } else if (b % 2 != 0) {//是偶数位并且不是偶数
  23.                 return false;
  24.             }
  25.             cnt++;
  26.             x /= 10;
  27.         }
  28.         return true;
  29.     }
  30. }
复制代码
4.R格式


解题思路:
本题观察使用数组模仿高精度,
  1. package 十五届;
  2. import java.util.Scanner;
  3. public class 高精度 {
  4.     public static void main(String[] args) {
  5.         int[] a = new int[(int) (2e3 + 10)];
  6.         String s = "";
  7.         int n = 0;
  8.         Scanner scanner = new Scanner(System.in);
  9.         s = scanner.nextLine();
  10.         n = scanner.nextInt();
  11.         StringBuffer stringBuffer = new StringBuffer(s);
  12.         stringBuffer.reverse();//反转字符串
  13.         int pos = s.indexOf('.');
  14.         stringBuffer.delete(pos, pos + 1);//把小数点删除,方便后续计算
  15.         int len = s.length();
  16.         for (int i = 0; i < len; i++) {
  17.             a[i + 1] = stringBuffer.charAt(i) - '0';
  18.         }
  19.         //高精度*低精度模板
  20.         for (int i = 1; i <= n; i++) {
  21.             //顺序扫描每一位,均*2
  22.             for (int j = 1; j <= len; j++) {
  23.                 a[j] = a[j] * 2;
  24.             }
  25.             //再次扫描。处理进位和最高位
  26.             for (int j = 1; j <= len; j++) {
  27.                 if (a[j] >= 10) {
  28.                     a[j + 1]++;
  29.                     a[j] %= 10;
  30.                     if (j == len) len++;
  31.                 }
  32.             }
  33.         }
  34.         //处理小数点后的第一位,进行四舍五入
  35.         if (a[pos] >= 5) {
  36.             a[pos + 1]++;
  37.         }
  38.         //倒序打印
  39.         for (int i = len; i >= pos+1; i--) {
  40.             System.out.print(a[i]);
  41.         }
  42.     }
  43. }
复制代码
第四题:宝石组合
题解·
 

  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. using namespace std;
  5. int a[100100], b[100100];
  6. vector<int> vec[100100];
  7. int n;
  8. int main() {
  9.     ios::sync_with_stdio(false);
  10.     cout.tie(nullptr);
  11.     cin >> n;
  12.     int max_a = 0;
  13.     for (int i = 1; i <= n; i++) {
  14.         cin >> a[i];
  15.         b[a[i]]++;
  16.         max_a = max(max_a, a[i]);
  17.     }
  18.     sort(a + 1, a + 1 + n);
  19.     for (int i = 2; i <= max_a; i++) {
  20.         for (int j = i; j <= max_a; j += i) {
  21.             for (int k = 1; k <= b[j]; k++) {
  22.                 if (vec[i].size() >= 3) break;
  23.                 vec[i].push_back(j);
  24.             }
  25.         }
  26.     }
  27.     for (int i = max_a; i >= 2; i--) {
  28.         if (vec[i].size() >= 3) {
  29.             cout << vec[i][0] << " " << vec[i][1] << " " << vec[i][2] << endl;
  30.             return 0;
  31.         }
  32.     }
  33.     cout << a[1] << " " << a[2] << " " << a[3] << endl;
  34.     return 0;
  35. }
复制代码
 


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用户云卷云舒

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表