首页 > Python资料 博客日记

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

2024-10-14 21:00:13Python资料围观31

本篇文章分享第十五届蓝桥杯C/C++学B组(解),对你有帮助的话记得收藏一下,看Python资料网收获更多编程知识

1.握手问题

解题思路一

数学方法

50个人互相握手 (49+1)*49/2   ,减去7个人没有互相握手(6+1)*6/2

答案:1024

解题思路二

思路:
模拟

        将50个人从1到50标号,对于每两个人之间只握一次手,我们可以将问题转化为每个人只主动和标号比他大的人握一次手,那么标号为 1 的人,需要主动握 49 次,标号为 2 的人,需要主动握 48 次,以此类推,标号为 i 的人需要主动握 50 - i 次。(这边强烈建议 I 人往后排)

        经过上述流程,我们即可得到不加限制条件下的总握手次数为 1 + 2 + ... + 48 + 49 = 1225

        接下来我们来处理限制条件,我们假设相互之间没有握手的这七个人为标号 1 ~ 7 的七个人,那么如果他们之间有相互握手的话,根据前述流程可得他们之间握手次数为 1 + 2 + ... + 6  = 21

        用总次数减去多余握手次数(前七个人间相互握手次数)即得到限制条件下的握手次数,即为 1204

可用代码实现求和、求差过程

package 十五届;

public class Min {
    public static void main(String[] args) {
        int ans = 0;
        for (int i = 1; i <= 50; i++) {
            for (int j = i+1; j <= 50; j++) {
                //排除掉7人的情况
                if(!(i>=1&&i<=7 && j>=1&&j<=7)){
                    ans++;
                }
            }
        }
        System.out.println(ans);
    }
}

 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))

package 十五届;

import static java.lang.Math.sqrt;

public class 小球反弹 {
    public static void main(String[] args) {
        int x = 343720;
        int y = 233333;
        int dx = 15;
        int dy = 17;
        int p = y * dx;
        int q = x * dy;
        int g = gcd(p, q);
        p /= g;
        q /= g;
        int t = 2 * p * x / dx;
        double ans = t * sqrt(15 * 15 + 17 * 17);
        //d答案输出两位小数
        System.out.printf("%.2f", ans);
    }

    public static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
}

答案:1100325199.77

3.好数

解题思路

 首先排除掉末位数,可以优化复杂度,满足条件后 在进一步检查偶数位是否为偶数,奇数位是否为奇数

package 十五届;

import java.util.Scanner;

public class 好数 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int ans = 0;
        for (int i = 1; i <= n; i++) {
            //局部优化:过滤数值结尾不符合条件的情况
            if (i % 10 % 2 == 0) continue;
            if (check(i)) ans++;//判断是否为好数
        }
        System.out.println(ans);
    }

    //检查x是否为好数
    public static boolean check(int x) {
        int cnt = 1; //记录位数
        while (x > 0) {
            int b = x % 10;
            if (cnt % 2 == 1) {//是奇数位并且不是奇数
                if (b % 2 != 1) return false;
            } else if (b % 2 != 0) {//是偶数位并且不是偶数
                return false;
            }
            cnt++;
            x /= 10;
        }
        return true;
    }
}

4.R格式

解题思路:

本题考察利用数组模拟高精度,

package 十五届;

import java.util.Scanner;

public class 高精度 {
    public static void main(String[] args) {
        int[] a = new int[(int) (2e3 + 10)];
        String s = "";
        int n = 0;
        Scanner scanner = new Scanner(System.in);
        s = scanner.nextLine();
        n = scanner.nextInt();

        StringBuffer stringBuffer = new StringBuffer(s);
        stringBuffer.reverse();//反转字符串

        int pos = s.indexOf('.');

        stringBuffer.delete(pos, pos + 1);//把小数点删除,方便后续计算
        int len = s.length();

        for (int i = 0; i < len; i++) {
            a[i + 1] = stringBuffer.charAt(i) - '0';
        }

        //高精度*低精度模板
        for (int i = 1; i <= n; i++) {
            //顺序扫描每一位,均*2
            for (int j = 1; j <= len; j++) {
                a[j] = a[j] * 2;
            }
            //再次扫描。处理进位和最高位
            for (int j = 1; j <= len; j++) {
                if (a[j] >= 10) {
                    a[j + 1]++;
                    a[j] %= 10;
                    if (j == len) len++;
                }
            }
        }
        //处理小数点后的第一位,进行四舍五入
        if (a[pos] >= 5) {
            a[pos + 1]++;
        }
        //倒序打印
        for (int i = len; i >= pos+1; i--) {
            System.out.print(a[i]);
        }
    }

}

第四题:宝石组合

题解:

1.先对宝石的 “闪亮度” 进行排序,从小到大排列。

2.枚举所有可能的三种宝石组合,可以采用三重循环来实现,其中第一个循环选择第一种宝石,第二个循环选择第二种宝石,第三个循环选择第三种宝石。

3.对于每种组合,计算它们的精美程度。精美程度可以定义为三种宝石的乘积除以它们的最小公倍数。最小公倍数可以通过最大公约数来求得。

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<map>
#include<utility>
using namespace std;
int gcd(int a,int b){
	if(!b)
		return a;
	return gcd(b,a%b);
}
int lcm(int a,int b){
	return a/gcd(a,b)*b;
}
void Solution()
{
	int n;
	cin>>n;
	vector<int>g(n);
	for(int &a:g)
		cin>>a;
	sort(g.begin(),g.end());
	int a=0,b=0,c=0;
	int maxx=0;
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(j!=i)
			{
				for(int k=0;k<n;k++){
					if(k!=j&&k!=i)
					{
						int q,w,e,r;
						
						q=lcm(g[i],g[j]);
						w=lcm(g[i],g[k]);
						e=lcm(g[j],g[k]);
						r=lcm(q,g[k]);
						int tem=g[i]*g[j]*g[k]*r/q/w/e;
						if(tem>maxx){
							maxx=tem;
							a=g[i];
							b=g[j];
							c=g[k];
						}
					}
				}
			}
		}
	}
	cout<<a<<' '<<b<<' '<<c;
	return;
}
int main()
{
	Solution();
	return 0;
}


版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!

标签:

相关文章

本站推荐