[2023 Blue Bridge Cup] 2018 Ninth C/C++ Group A preguntas reales (notas de análisis)

Tabla de contenido

[Fracciones] Multiplicación cíclica/exponenciación rápida/máximo común divisor

[Lunes] Año bisiesto/Ciclo

【Multiplicar el cero final】recorrido/resto/redondeo

【El número de la suerte】 atravesar

[Imprimir gráficos] dfs complete los espacios en blanco

× 【Tiempo de vuelo】conversión de cadena/pensamiento/tiempo

× [Ataque de tres cuerpos] ¡Diferencia! dificultad media

【Calentamiento global】dfs/bloques conectados+conteo

* 【Problema múltiple】Violencia/Teoría de números/Construcción

× 【Problema de pago de facturas】Codicioso


[Fracción] Multiplicación cíclica/exponenciación rápida/máximo común divisor

Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.

1+1/2+1/4+1/8+⋯

Cada elemento es la mitad del elemento anterior, si son 2020 elementos en total, averigüe cuál es la suma y el resultado se expresará en fracciones.

Similar a: 3/2, por supuesto, esto es solo agregar los primeros 2 elementos. El numerador y el denominador requieren prima mutua.

Puntos de prueba: multiplicación cíclica/exponenciación rápida

int gcd=__gcd(a,sum); //Encontrar el máximo común divisor 

#include<bits/stdc++.h>
using namespace std;

int main(){
	int a=1;
	int sum=0;
	for(int i=1; i<=2020; i++){
		sum=sum+a;		//分子 
		a=a*2; 			//更新a,最终为分母 		
	}
	int gcd=__gcd(a,sum);	//求最大公因数 
	a = a/gcd; 				//除法
	sum = sum/gcd; 
	printf("%d/%d",sum,a/2);
}

【Lunes】ciclo de año bisiesto/período

Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.

¿Cuántos lunes hay en todo el siglo 2020 (entre el 1 de enero de 1901 y el 31 de diciembre de 2000)? ) 5217

Sitio de prueba: año bisiesto / ciclo

#include<bits/stdc++.h>
using namespace std;

//判断闰年
bool isleap(int x){
	return x%400==0||(x%4==0&&x%100!=0);
} 
int main(){
	int t=0;
	//计算总天数 
	for(int i=1901; i<=2000; i++){
		if(isleap(i))
		 t+=366;
		else t+=365;
	}
	//查日历已知2000年12月31日
	//扣除26日至31日的6天 
	t-=6; 
	int res=0;
	//从周一开始计数 
	for(int i=t; i>0; i-=7){
		res++;
	} 
	cout<<res<<endl;
}

[producto cero final] recorrido/resto/redondeo

Cero final del producto - Lanqiao Cloud Class (lanqiao.cn)

Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.

En las siguientes 1010 filas de datos, cada fila tiene 10 números enteros, averigüe cuántos ceros hay al final de su producto.

5650 4542 3554 473 946 4114 3871 9073 90 4329 
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 
1486 5722 3135 1170 4014 5510 5120 729 2880 9019 
2049 698 4582 4346 4427 646 9742 7340 1230 7683 
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 
6701 6645 1671 5978 2704 9926 295 3125 3878 6785 
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 
689 5510 8243 6114 337 4096 8199 7313 3685 211 

Método 1: recorrido/resto/redondeo

Método 2: Primero averigüe cuántos números se pueden multiplicar para que sean iguales a cero; calcule cuántos números en él contienen 5 y 2; luego compare para averiguar cuántos números se pueden multiplicar por 5 y 2 para que sean iguales a cero; luego emita

#include<bits/stdc++.h>
using namespace std;
long long a[10][10]; 

int main(){
	//读取数据 
	for(int i=1;i<=10;i++){
		for(int j=1; j<=10; j++){
			cin>>a[i][j];
		}
	}
	//计算乘积
	int count=0;
	long long res=1; 
	long long x=1000000000;
	for(int i=1;i<=10;i++){
		for(int j=1; j<=10; j++){
			//cout<<a[i][j]<<endl;
			res=res*a[i][j];
			//末尾为0计数 
			while(res%10==0){
				res/=10;
				count++; 
			} 
			res=res%x;
		}
	}
	cout<<count<<endl;
}
#include <iostream>
using namespace std;
int cnt2,cnt5;
int a[100];

int main(){
  for(int i=0;i<=99;i++){
   cin>>a[i];
    while(a[i]%2==0){
      cnt2++;
      a[i]/=2;
    }
    while(a[i]%5==0){
      cnt5++;
      a[i]/=5;
    }
  }
  cout << min(cnt2,cnt5) << endl;
  return 0;
}

【El primer número de la suerte】  recorrido

Esta pregunta es una pregunta para completar los espacios en blanco. Después de calcular el resultado, use la declaración de salida en el código para generar el resultado completo.

A los turistas que viajan al planeta X se les asigna un número entero como número de turista.

El Rey del Planeta X tiene una peculiaridad, solo le gustan los números 3, 5 y 7.

El rey estipula que si el número de turistas solo contiene factores: 3, 5, 7, pueden obtener un premio.

Veamos que los primeros 10 números de la suerte son: 3,5,7,9,15,21,25,27,35,45, entonces el número 11 de la suerte es: 49
Xiaoming recibió un número de la suerte 59084709587505, fue a recibir el premio Cuando llegó el momento, se le pidió que dijera exactamente qué número de la suerte era, de lo contrario no recibiría el premio.

Ayude a Xiao Ming a calcular, 59084709587505 es el número de la suerte. 1905

Escenario: travesía

#include<bits/stdc++.h>
using namespace std;

int main(){
  //目标 n = a*b*c
  //a,b,c为3,5,7的倍数
  long long n = 59084709587505;
  int ans=0;
  for(long long i=1; i<=n; i*=3){
     for(long long j=1; i*j<=n; j*=5){
       for(long long k=1; k*i*j<=n; k*=7){
          ans++;
       }
     }
  }
  //排除1*1*1情况
  cout << ans - 1;
  return 0;
}

[Imprimir gráficos] dfs llenar el espacio en blanco

Esta pregunta es una pregunta de finalización de código. Complete el código fuente proporcionado en la pregunta, cópielo en el cuadro de código a la derecha, seleccione el idioma de compilación correspondiente (C/Java) y envíelo. Si los idiomas del código fuente proporcionados en el tema no son únicos, solo necesita elegir uno de ellos para completar y enviar. Después de copiar, debe eliminar el subrayado en la parte en blanco del código fuente y completar su respuesta. Si no pasa después de la presentación, además de considerar errores en el llenado de los espacios en blanco, también es necesario prestar atención a si hay errores causados ​​por cambios en la falta de llenado de los espacios en blanco después de la copia.

El siguiente programa dibujará un gráfico fractal (es decir, un gráfico con autosimilitud general y local) en la consola.

Cuando n=1,2,3, el resultado es el siguiente: analice el programa cuidadosamente y complete los códigos que faltan en la parte subrayada.

Cuando n=1:

 o 
ooo
 o 

 Cuando n=2:

    o    
   ooo   
    o    
 o  o  o 
ooooooooo
 o  o  o 
    o    
   ooo   
    o    

Cuando n=3:

             o             
            ooo            
             o             
          o  o  o          
         ooooooooo         
          o  o  o          
             o             
            ooo            
             o             
    o        o        o    
   ooo      ooo      ooo   
    o        o        o    
 o  o  o  o  o  o  o  o  o 
ooooooooooooooooooooooooooo
 o  o  o  o  o  o  o  o  o 
    o        o        o    
   ooo      ooo      ooo   
    o        o        o    
             o             
            ooo            
             o             
          o  o  o          
         ooooooooo         
          o  o  o          
             o             
            ooo            
             o             

Método: la imagen es similar a la expansión hacia afuera, el número se establece aleatoriamente primero y se verifica el efecto de realización básico, dfs llena los espacios en blanco

#include <stdio.h>
#include <stdlib.h>

void show(char* buf, int w){
    int i,j;
    for(i=0; i<w; i++){
        for(j=0; j<w; j++){
            printf("%c", buf[i*w+j]==0? ' ' : 'o');
        }
        printf("\n");
    }
}

void draw(char* buf, int w, int x, int y, int size){
    if(size==1){
        buf[y*w+x] = 1;
        return;
    }
    
    //int n = _________________________ ; //填空
    //int n = 1 ; //尝试效果 n=1 成立 
	int n = size/3 ; 
    draw(buf, w, x, y, n);
    draw(buf, w, x-n, y ,n);
    draw(buf, w, x+n, y ,n);
    draw(buf, w, x, y-n ,n);
    draw(buf, w, x, y+n ,n);
}

int main()
{
    int N ;
        scanf("%d",&N);
    int t = 1;
    int i;
    for(i=0; i<N; i++) t *= 3;
    
    char* buf = (char*)malloc(t*t);
    for(i=0; i<t*t; i++) buf[i] = 0;
    
    draw(buf, t, t/2, t/2, t);
    show(buf, t);
    free(buf);
    
    return 0;
}

【Tiempo de vuelo】 cadena /pensamiento/conversión de tiempo

Tiempo de vuelo: clase de nube Lanqiao (lanqiao.cn)

Xiao h fue a los Estados Unidos para participar en la Competencia Internacional de la Copa Blue Bridge. La novia de la pequeña h se enteró que la pequeña h partió a las diez de la mañana y llegó a Estados Unidos a las doce de la mañana, por lo que suspiró, "ahora el avión vuela tan rápido que puedes llegar a Estados Unidos". Unidos en dos horas".

La pequeña h está aterrorizada por los vuelos supersónicos. Después de una cuidadosa observación, se encontró que los tiempos de despegue y aterrizaje de los aviones eran todos en hora local. Dado que hay una diferencia horaria de 12 horas entre Beijing y la parte este de los Estados Unidos, el avión necesita un total de 14 horas de vuelo. 

Poco después, la novia de Xiao h fue al Medio Oriente para un intercambio. Little h no sabe la diferencia horaria entre Oriente Medio y Pekín. Pero el pequeño h obtuvo la hora de despegue y aterrizaje del vuelo de ida y vuelta de su novia. El pequeño h quiere saber el tiempo de vuelo del vuelo de su novia.

Para un vuelo que puede cruzar zonas horarias, se dan las horas de despegue y aterrizaje del viaje de ida y vuelta. Suponiendo que el tiempo de vuelo de ida y vuelta del avión es el mismo, encuentre el tiempo de vuelo del avión.

Método: pensamiento matemático/pensamiento/conversión de tiempo

#include<bits/stdc++.h>
using namespace std;

const int day = 24*60*60;    //全部转化为秒 
const int hour = 60*60;
const int minutes = 60;
 
int start() {      //出发时间 
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
    int time = a*hour + b*minutes + c;
    return time;
}
 
int end() {   //到达时间 
    int a,b,c;
    scanf("%d:%d:%d",&a,&b,&c);
    int time = a*hour + b*minutes + c;
    char ch,extra_day;
    while( (ch = getchar())!='\n' && ch != '\r' ) {
        if(ch == '(') {
            getchar();  //除去"+" 
            extra_day = getchar();   //额外天数 
            time = time + (extra_day - '0')*day;
        }
    } 
    return time;
}
 
void display(int time) {    //显示时间 
    int a,b,c;
    a = time/hour;
    time = time % hour;
    b = time / minutes;
    time = time % minutes;
    c = time;
    printf("%02d:%02d:%02d\n",a,b,c);
}
 
int main() {
    int h1,m1,s1,h2,m2,s2;
    int t;
    scanf("%d",&t);
    while(t--) {
        int start1 = start();
        int end1 = end();
        int start2 = start();
        int end2 = end();
        int ans = 0;
        ans = (end1 - start1) + (end2 - start2);  //相加 
        display(ans/2);    //除2 
    }
    return 0;
}

[Ataque de tres cuerpos] ¡Diferencia! dificultad media

Ataque de tres cuerpos - Clase de nube Lanqiao (lanqiao.cn)

 Difíciles, ¡no profundices todavía!

#include<iostream>
using namespace std;
const int N = 1000005;
int A, B, C, n, m;
int D[N];//三维差分数组 压维
int s[N];//存储舰队生命值
int x_1[N], y_1[N], z_1[N];//存储三体人的打击范围
int x_2[N], y_2[N], z_2[N];//存储三体人的打击范围
int d[N];//存储伤害
//将三维坐标转换为一维
int num(int x, int y, int z) {
    if (x > A || y > B || z > C)return 0;
    return ((x - 1) * B + (y - 1)) * C + (z - 1) + 1;
}
bool check(int x) {
    for (int i = 1;i <= n;i++)D[i] = 0;
    for (int i = 1;i <= x;i++) {
        D[num(x_1[i], y_1[i], z_1[i])]+=d[i];
        D[num(x_2[i] + 1, y_1[i], z_1[i])]-= d[i];
        D[num(x_1[i], y_2[i] + 1, z_1[i])]-= d[i];
        D[num(x_1[i], y_1[i], z_2[i] + 1)]-= d[i];
        D[num(x_2[i] + 1, y_2[i] + 1, z_1[i])]+= d[i];
        D[num(x_2[i] + 1, y_1[i], z_2[i] + 1)]+= d[i];
        D[num(x_1[i], y_2[i] + 1, z_2[i] + 1)]+= d[i];
        D[num(x_2[i] + 1, y_2[i] + 1, z_2[i] + 1)]-= d[i];
    }
    //将x,y看为定轴 对z进行累加
    for (int i = 1;i <= A;i++) {
        for (int j = 1;j <= B;j++) {
            for (int k = 1;k <= C;k++) {
                D[num(i, j, k + 1)] += D[num(i, j, k)];
            }
        }
    }
    //将x,z看为定轴 对y进行累加
    for (int k = 1;k <= C;k++) {
        for (int i = 1;i <= A;i++) {
            for (int j = 1;j <= B;j++) {
                D[num(i, j + 1, k)] += D[num(i, j, k)];
            }
        }
    }
    //将y,z看为定轴 对x进行累加
    for (int j = 1;j <= B;j++) {
        for (int k = 1;k <= C;k++) {
            for (int i = 1;i <= A;i++) {
                D[num(i + 1, j, k)] += D[num(i, j, k)];
            }
        }
    }
    for (int i = 1;i <= n;i++) {
        if (D[i] > s[i])return true;
    }
    return false;
}
int main() {
    cin >> A >> B >> C >> m;
    n = A * B * C;
    for (int i = 1;i <= n;i++) cin >> s[i];
    for (int i = 1;i <= m;i++) {
        cin >> x_1[i] >> x_2[i] >> y_1[i] >> y_2[i] >> z_1[i] >> z_2[i] >> d[i];
    }
    int L = 1;
    int R = m;
    while (L < R) {
        int mid = (L + R) >> 1;
        if (check(mid))R = mid;
        else L = mid + 1;
    }
    cout << L << endl;
    return 0;
}

[Calentamiento global] dfs/bloque conectado + recuento

dfs: recorrido primero en profundidad, problema 1: ¡la profundidad de recursión es profunda y la memoria de pila es insuficiente!

bfs: recorrido primero en amplitud, cola de objetos oficial

#include<bits/stdc++.h>
using namespace std;
int N;
const int SIZE = 1e4+4; 
char area[SIZE][SIZE];
bool flag;
int cnt; 
int d[4][2]={
   
   {1,0},{-1,0},{0,1},{0,-1}};
//注意:求的是被淹没的岛屿的数量   总岛屿数量-被淹没的岛屿的数量 
int ans=0;            //没有被淹没岛屿的数量 
int res_ans=0;        //岛屿的总数量 
//用DFS判断搜到的这个岛屿会不会被淹没,仅此而已,不需要返回什么 昨判断关系
void dfs(int x,int y)
{
    //一个岛屿只要有一个点满足就不会变淹没了
    if(flag==false){  
        cnt = 0;
    for(int i=0; i<4; i++){
        int tx=d[i][0]+x;
        int ty=d[i][1]+y;
        //四面环海 
        if(area[tx][ty]!='.')
        cnt++;
    }
    
    //有一个点满足不会被淹没的条件
    if(cnt==4){
        ans++;
        flag=true;//这个岛屿不需要再遍历了
         }
    }
    area[x][y]='*';//将遍历过的点变为 *,下一次就不会遍历他了,所以不用标记数组
    //注意这里不可以是‘.’因为上面if(area[tx][ty]!='.')cnt++
    for(int i=0;i<4;i++){
         int xx = x + d[i][0];
         int yy = y + d[i][1];
         //当前岛屿连接其他岛屿 
         if(area[xx][yy]=='#'&&x<N&&x>=0&&y<N&&y>=0)
         dfs(xx,yy);
    }
}
 
int main()
{    
    cin>>N; 
    //输入海洋和陆地的情况 
    for(int i=0; i<N; i++)
        for(int j=0; j<N; j++)
            cin>>area[i][j];
    //遍历查找陆地的位置情况       
    for(int i=0; i<N; i++){ 
        for(int j=0; j<N; j++){
            if(area[i][j]=='#'){
                res_ans++;
                flag=false;
                //判断当前岛屿会不会淹没 
                dfs(i,j);
            }
        }
    }        
    cout<<res_ans-ans;    
    return 0;
}

[Problemas múltiples] Violencia/Teoría de números/Construcción

Problemas Múltiples - Lanqiao Cloud Class (lanqiao.cn)

Análisis de las preguntas reales de la Copa Lanqiao 8th-10th - 9 múltiplos de las preguntas reales de la competencia provincial 2018 - (ideas + C) - Lanqiao Cloud Class (lanqiao.cn)

Como todos sabemos, Xiao Cong es bueno para calcular, especialmente bueno para calcular si un número es múltiplo de otro número. Pero Shallot solo es bueno en dos números, y estará más angustiado cuando haya muchos números. Ahora Shallot te ha dado n números, y espero que puedas encontrar tres números a partir de estos n números, de modo que la suma de estos tres números sea un múltiplo de K, y esta suma sea la mayor. Se garantiza que los datos tienen una solución.

Gana puntos según el tamaño, la violencia es violencia.

 Fortalécete y luego míralo antes del examen. . . . . .

//基础分??
#include<bits/stdc++.h>
using namespace std;
int main(){
	//n个正整数,选数要求是K的倍数 
	int n,k;
	cin>>n>>k;
	int a[n];
	for(int i=0; i<n; i++){
		cin>>a[i];
	} 
	//符合条件的三个数和sum,最大的记为max
	int sum=0; 
	int maxsum=0; 
	for(int i=0; i<n; i++){
		for(int j=i+1; j<n; j++){
			for(int z=j+1; z<n; z++){
				sum = a[i]+a[j]+a[z];
				if(sum%3==0) maxsum=max(sum,maxsum);				
			}
		}
	}
	
	cout<<maxsum<<endl;
	return 0;
} 

【Problema de pago de facturas】Codicioso

Análisis de las preguntas reales de la 8.ª y 10.ª Copa Lanqiao - Competencia provincial 2018 pregunta real 10 problema de pago - Lanqiao Cloud Class (lanqiao.cn)

 

revisión del examen

Método codicioso:

  1. Prepárese para ser codicioso: primero ordene la matriz de costos de pequeña a grande
  2. Estrategia codiciosa:
    1. Comenzando desde el elemento más pequeño de la matriz, haga un juicio cada vez
    2. Si el elemento actual es menor que el costo promedio del costo restante, tome el elemento sin cambiar el valor y transfiera el costo promedio a los elementos posteriores
    3. Si el elemento actual es mayor o igual al valor promedio del costo restante, el elemento posterior también es mayor que el valor promedio y puede asumir el costo del elemento más pequeño anterior y tomar el valor promedio del costo restante para todos los elementos después del elemento actual
  3. Termine con Greedy, resuelva para la desviación estándar

Exactitud:

Esta pregunta tiene altos requisitos de precisión, y los métodos para mejorar la precisión se resumen a continuación.

  1. long long mejora la precisión de los números enteros
  2. El doble puede aceptar alrededor de 18 cifras significativas
  3. Minimiza la división, convierte a multiplicación
  4. Minimice la cantidad de cálculos que causan errores
#include <cstdio>
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;

int main(){
  ll N;
  double S, avg = 0;
  cin >> N >> S;
  int A[500005];
  
  for(int i = 0; i < N; i++)
    cin >> A[i];
  avg = S*1.0/N;
  sort(A, A+N);

  double ans = 0;
  for(int i = 0 ;  i < N; i++){
    if(A[i]*(N-i) < S){
        ans += (avg - A[i]) * (avg - A[i]);
        S -= A[i];
    }
    else{
      double cur = S*1.0/(N-i);
      ans += (cur-avg)*(cur-avg)*(N-i);
      break;
    }
  }

  printf("%.4lf", sqrt(ans/N));
  return 0;
}

Supongo que te gusta

Origin blog.csdn.net/MengYa_Dream/article/details/129274192
Recomendado
Clasificación