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

FENG.Lxj 2024-10-15 16:05:02 阅读 52

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

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

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

<code>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格式

解题思路:

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

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

<code>#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;

}



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。