2020 XI Copa Blue Bridge C / C ++ Competencia Provincial Grupo A Problema Soluciones

A

Inserte la descripción de la imagen aquí

624
atraviesa cada número, toma el resto para juzgar cada bit

#include<iostream>
using namespace std;

int main()
{
    
    
	int cnt=0;
	for(int i=1;i<=2020;i++)
	{
    
    
		int tmp=i;
		while(tmp)
		{
    
    
			if(tmp%10==2)
				cnt++;
			tmp/=10;
		}
	}
	cout<<cnt;
	return 0;
}

B


2481215
dos ciclos para determinar si el máximo común divisor es 1

#include<iostream>
using namespace std;

int gcd(int a,int b)
{
    
    
	if(b==0)
	return a;
	else 
	return gcd(b,a%b);	
}

int main()
{
    
    
	int cnt=0;
	for(int i=1;i<=2020;i++)
		for(int j=1;j<=2020;j++)
			if(gcd(i,j)==1)
				cnt++;
	cout<<cnt;
	return 0;
}

C

Inserte la descripción de la imagen aquí
761
Encontrar la ley directamente es más rápido
(1,1) 1 = 0 + 1
(2,2) 5 = (1 + 2) +2
(3,3) 13 = (1 + 2 + 3 + 4) +3
( i, I) x = (1 + 2 + 3 +… + 2 (i-1)) + i = (i-1) (2i-1) + i
con código de relleno en forma de serpiente

#include<iostream>
using namespace std;

int a[1001][1001];

int main()
{
    
    
	int cnt=1;
	int i=1,j=1;
	a[i][j]=cnt;
	while(cnt<10000)
	{
    
    
		
		if(i==1)
			j++;
		a[i][j]=++cnt;
		while(j>1)
			a[++i][--j]=++cnt;
		if(j==1)
			i++;
		a[i][j]=++cnt;
		while(i>1)
			a[--i][++j]=++cnt;
	}
	cout<<a[20][20];
	return 0;
}

D

Inserte la descripción de la imagen aquí
80
mapas de construcción, dfs. Cada luz puede estar encendida o apagada, enumere 2 ^ 7.

#include<iostream>
using namespace std;

const int N=8;
int map[N][N],fa[N],vis[N],ans;

int getfa(int i)										//寻找根节点 
{
    
    
	if(fa[i]==i)
		return i;
	return fa[i]=getfa(fa[i]);							//压缩路径 
}

void dfs(int k)
{
    
    
	if(k>7)												//7个灯都枚举完了 
	{
    
    
		for(int i=1;i<=7;i++)							//先把自己设为自己的父节点 
			fa[i]=i;
		for(int i=1;i<=7;i++)
			for(int j=1;j<=7;j++)
			{
    
    
				if(map[i][j]&&vis[i]&&vis[j])			//将连通且亮着的灯,并在一块 
				{
    
    
					int faa=getfa(i),fab=getfa(j);
					if(faa!=fab)
						fa[faa]=fab;
				}
			}
		int cnt=0;
		for(int i=1;i<=7;i++)							//有几个根节点说明有几个集合 
			if(fa[i]==i&&vis[i])						//亮着的灯的集合数 
				cnt++;
		if(cnt==1)										//都连通的话,只有一个集合 
			ans++;							
		return;
	}
	vis[k]=1;											//k灯亮  dfs中k+1亮和灭 
	dfs(k+1);
	vis[k]=0;											//k灯灭 
	dfs(k+1);
}

int main()
{
    
    
	map[1][2]=map[2][1]=1;map[1][6]=map[6][1]=1;	//连通的存图 
	map[6][7]=map[7][6]=1;map[6][5]=map[5][6]=1;
	map[2][7]=map[7][2]=1;map[2][3]=map[3][2]=1;
	map[5][7]=map[7][5]=1;map[5][4]=map[4][5]=1;
	map[3][7]=map[7][3]=1;map[4][3]=map[3][4]=1;
	dfs(1);
	cout<<ans;
	return 0;
}

mi

Inserte la descripción de la imagen aquí
1391
Entre rectas arbitrarias (incluidas rectas y curvas) que no se intersecan en el mismo punto, el plano se puede dividir en tantas partes como sea posible.
Según el teorema de Euler V − E + F − T = 1, T = 0, Resuelva para F = 1 + E − V, solo necesita resolver el número de puntos V y el número de lados V.
Según nuestro análisis, dos líneas rectas cualesquiera pueden tener un punto de intersección, el número es (202); hay dos puntos de intersección entre dos círculos cualesquiera, el número es 2⋅ (202); hay dos puntos de intersección entre un círculo arbitrario y una línea recta, el número es 20 × 20 × 2,
entonces V = (202) +2 ⋅ (202) + 20 × 20 × 2 = 1370 Lo
mismo es cierto En nuestro análisis, una línea recta se interseca con las 19 líneas rectas restantes en un punto cada una, y 20 círculos se intersecan en dos puntos cada uno, por lo que hay 19 + 20 × 2 = 59 puntos en la línea, y una línea recta se divide en 60 lados; un círculo se interseca con los 19 círculos restantes y 20 líneas rectas en dos puntos cada uno, un total de (19 + 20) × 2 = 78 puntos, un círculo se divide en 78 lados,
por lo que E = 60 × 20 + 78 × 20 = 2760,
por lo tanto, obtiene la respuesta: F = 1 + 2760−1370 = 1391

F

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

#include<iostream>
#include<cstdio>
using namespace std;

int a[100001];

int main()
{
    
    
	int n,maxx=-1,minn=101;
	cin>>n;
	long long s=0;
	double ave;
	for(int i=1;i<=n;i++)
	{
    
    
		scanf("%d",&a[i]);
		s+=a[i];
		maxx=max(maxx,a[i]);
		minn=min(minn,a[i]);
	}
	ave=s/double(n);
	printf("%d\n%d\n%.2lf",maxx,minn,ave);	
}

GRAMO

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Juzga cada fecha, toma el resto de la fecha, almacena cada bit en la matriz y juzga si lo correspondiente es igual o no.
Presta atención para juzgar que la fecha es legal

#include<iostream>
using namespace std;

int main()
{
    
    
	int n,ans1=0,ans2=0;
	int a[10];
	cin>>n;
	for(int i=n+1;;i++)
	{
    
    
		int j=1;
		int tmp=i;
		while(j<=8)
		{
    
    
			a[j++]=tmp%10;
			tmp/=10;
		}
		bool flag=0;
		int m=a[5]*10+a[6],k=a[7]*10+a[8],y;
		switch(m)
		{
    
    
			case 4:
			case 6:
			case 9:
			case 11:
				if(m>30) flag=1;
				break;
			case 2:
				y=a[1]*1000+a[2]*100+a[3]*10+a[4];
				if((y%4==0&&y%100!=0)||y%400==0) {
    
    if(m>29) flag=1;break;}
				else {
    
    if(m>28) flag=1;break;}
			default:
				if(m>31) flag=1;
				break;	
		}
		if(flag)
			continue;
		if(a[1]==a[3]&&a[1]==a[6]&&a[1]==a[8]&&a[2]==a[4]&&a[2]==a[5]&&a[2]==a[7])
			for(int j=8;j;j--)
			{
    
    
				ans2*=10;
				ans2+=a[j];
			}
		if(a[1]==a[8]&&a[2]==a[7]&&a[3]==a[6]&&a[4]==a[5]&&!ans1)
			for(int j=8;j;j--)
			{
    
    
				ans1*=10;
				ans1+=a[j];
			}
		if(ans1&&ans2)
			break;	
	}
	cout<<ans1<<endl<<ans2;
	return 0;
}

H

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Se puede enumerar y realizar un ciclo triple. De esta manera, n debe ser menor que 100. Obviamente no es el
número de subcadenas aportadas por cada letra. Su subíndice es el valor absoluto del subíndice de la misma letra antes y después. la misma letra. Multiplica, y luego acumula cada letra es la respuesta. Por
Inserte la descripción de la imagen aquí
ejemplo, esta cadena en la figura, cuente el número de subcadenas de contribución de la posición 4 a, el
primer subíndice es 1 y el último es 6 (4 -1) * (6 -4) = 6
Explique que 4-1 corresponde a bca (No. 234) y 6-4 corresponde a ab (No. 45)
. Las subcadenas con bca como posición inicial y ba como final todas las posiciones contienen solo la cuarta a, y es una subcadena
que contiene solo la cuarta a, es decir, bca bcab ca cab a ab.
Tenga en cuenta que al principio, puede que no haya la misma letra antes o después

#include<iostream>
#include<string>
using namespace std;

const int N=1e5+5;
int pre[N],nex[N],a[27];
string s;

int main()
{
    
    
	cin>>s;
	s="0"+s;						//下标从1开始 
	int n=s.length()-1;				//长度 
	for(int i=1;i<=n;i++)			//寻找前一个相同字符下标 
	{
    
    
		int c=s[i]-'a';
		pre[i]=a[c];
		a[c]=i;
	}
	for(int i=0;i<26;i++)			//初始化,可能后边没有相同字符    寻找前一个时,未初始,因为a数组默然为0 
		a[i]=n+1;
	for(int i=n;i;i--)				//寻找后一个相同字符下标 
	{
    
    
		int c=s[i]-'a';
		nex[i]=a[c];
		a[c]=i;
	}
	long long int ans=0;
	for(int i=1;i<=n;i++)
		ans+=(long long)(i-pre[i])*(nex[i]-i);//相乘计算累加
	cout<<ans; 
	return 0;
}

I

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Encuentra el área de la parte superpuesta de la elipse y el triángulo, no me perdones

J

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Uh uh uh, todavía no, ¿
quién me enseñará orz?

Supongo que te gusta

Origin blog.csdn.net/m0_54621932/article/details/114024665
Recomendado
Clasificación