2020 11e Blue Bridge Cup C / C ++ Compétition provinciale Groupe A Solutions aux problèmes

UNE

Insérez la description de l'image ici

624
traversent chaque nombre, prenez le reste pour juger chaque 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
deux cycles pour déterminer si le plus grand diviseur commun est 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

Insérez la description de l'image ici
761
Trouver la loi directement est plus rapide
(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
avec code de remplissage en forme de serpent

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

Insérez la description de l'image ici
80
plans de construction, dfs. Chaque lumière peut être allumée ou éteinte, énumérer 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;
}

E

Insérez la description de l'image ici
1391
Entre des droites arbitraires (y compris des droites et des courbes) qui ne se coupent pas au même point, le plan peut être divisé en autant de parties que possible.
Selon le théorème d'Euler V − E + F − T = 1, T = 0, résoudre pour F = 1 + E − V, il suffit de résoudre le nombre de points V et le nombre de côtés V.
Selon notre analyse, deux droites quelconques peuvent avoir un point d'intersection, le nombre est (202); il y a deux points d'intersection entre deux cercles quelconques, le nombre est 2⋅ (202); il y a deux points d'intersection entre un cercle arbitraire et une ligne droite, le nombre est 20 × 20 × 2,
donc V = (202) +2 ⋅ (202) + 20 × 20 × 2 = 1370
Il en va de même.Dans notre analyse, une ligne droite est coupée par les 19 lignes droites restantes en un point chacune, et 20 cercles sont coupés en deux points chacun, il y en a donc 19 + 20 × 2 = 59 points sur la ligne, et une ligne droite est divisée en 60 côtés; Un cercle est coupé par les 19 cercles restants et 20 lignes droites en deux points chacun, soit un total de (19 + 20) × 2 = 78 points, un cercle est divisé en 78 côtés,
donc E = 60 × 20 + 78 × 20 = 2760
obtient donc la réponse: F = 1 + 2760−1370 = 1391

F

Insérez la description de l'image ici
Insérez la description de l'image ici

#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);	
}

g

Insérez la description de l'image ici
Insérez la description de l'image ici
Jugez chaque date, prenez le reste de la date et stockez chaque bit dans le tableau, et jugez si le correspondant est égal ou non.
Faites attention pour juger que la date est légale

#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

Insérez la description de l'image ici
Insérez la description de l'image ici
Il peut être énuméré et triplé. De cette façon, n doit être inférieur à 100. Il ne s'agit évidemment pas du
nombre de sous-chaînes apportées par chaque lettre. Son indice est la valeur absolue de l'indice de la même lettre avant et après la même lettre. Multiplier, puis accumuler chaque lettre est la réponse. Par
Insérez la description de l'image ici
exemple, cette chaîne dans la figure, comptez le nombre de sous-chaînes de contribution de la position 4 a, le
premier indice est 1 et le dernier est 6 (4 -1) * (
6-4 ) = 6 Expliquez que 4-1 correspond à bca (n ° 234) et 6-4 correspond à ab (n ° 45)
. Les sous-chaînes avec bca comme position de départ et ba comme fin position ne contiennent que le 4e a, et c'est une sous
- chaîne qui ne contient que le 4e a, c'est-à-dire bca bcab ca cab un ab.
Notez qu'au début, il peut ne pas y avoir la même lettre avant ou aprè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;
}

je

Insérez la description de l'image ici
Insérez la description de l'image ici
Trouvez l'aire de la partie superposée de l'ellipse et du triangle, ne me pardonnez pas

J

Insérez la description de l'image ici
Insérez la description de l'image ici
Uh euh euh, toujours non,
qui m'apprendra orz

Je suppose que tu aimes

Origine blog.csdn.net/m0_54621932/article/details/114024665
conseillé
Classement