2020 11. Blue Bridge Cup C / C ++ Provinzwettbewerbsgruppe A Problemlösungen

EIN

Fügen Sie hier eine Bildbeschreibung ein

624
durchquere jede Zahl, nimm den Rest, um jedes Bit zu beurteilen

#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
zwei Zyklen, um zu bestimmen, ob der größte gemeinsame Teiler 1 ist

#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.

Fügen Sie hier eine Bildbeschreibung ein
761
Das Gesetz direkt zu finden ist schneller
(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
mit schlangenförmigem Füllcode

#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.

Fügen Sie hier eine Bildbeschreibung ein
80
Gebäudekarten, dfs. Jedes Licht kann ein- oder ausgeschaltet sein, zähle 2 ^ 7 auf.

#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.

Fügen Sie hier eine Bildbeschreibung ein
1391
Zwischen beliebigen Linien (einschließlich gerader Linien und Kurven), die sich nicht am selben Punkt schneiden, kann die Ebene in möglichst viele Teile unterteilt werden.
Nach dem Euler-Theorem V - E + F - T = 1, T = 0, Löse nach F = 1 + E - V, du musst nur nach der Anzahl der Punkte V und der Anzahl der Seiten V lösen.
Nach unserer Analyse können zwei beliebige gerade Linien einen Schnittpunkt haben, die Zahl ist (202); Es gibt zwei Schnittpunkte zwischen zwei beliebigen Kreisen. Die Zahl ist 2⋅ (202). Es gibt zwei Schnittpunkte zwischen einem beliebigen Kreis und einer geraden Linie. Die Zahl ist 20 × 20 × 2,
also V = (202) +2 ⋅ (202) + 20 × 20 × 2 = 1370
Dasselbe gilt In unserer Analyse wird eine gerade Linie von den verbleibenden 19 geraden Linien an jeweils einem Punkt geschnitten, und 20 Kreise werden an jeweils zwei Punkten geschnitten, sodass es 19 gibt + 20 × 2 = 59 Punkte auf der Linie, und eine gerade Linie ist in 60 Seiten unterteilt. Ein Kreis wird von den verbleibenden 19 Kreisen und 20 geraden Linien an jeweils zwei Punkten geschnitten, insgesamt (19 + 20) × 2 = 78 Punkte, ein Kreis ist in 78 Seiten unterteilt,
sodass E = 60 × 20 + 78 × 20 = 2760
die Antwort erhält: F = 1 + 2760−1370 = 1391

F.

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein

#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

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Beurteilen Sie jedes Datum, nehmen Sie den Rest des Datums und speichern Sie jedes Bit im Array. Beurteilen Sie, ob das entsprechende
Datum gleich ist oder nicht. Achten Sie darauf, dass das Datum legal ist

#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.

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Es kann aufgezählt und dreifach getaktet werden. Auf diese Weise muss n kleiner als 100 sein. Offensichtlich ist es nicht die
Anzahl der Teilzeichenfolgen, die von jedem Buchstaben beigesteuert werden. Sein Index ist der absolute Wert des Index desselben Buchstabens davor und danach Der gleiche Buchstabe. Multiplizieren Sie und akkumulieren Sie dann jeden Buchstaben.
Fügen Sie hier eine Bildbeschreibung ein
Dies ist die Antwort. Zählen Sie beispielsweise mit dieser Zeichenfolge in der Abbildung die Anzahl der Beitragssubstrings von Position 4a, wobei der
erste a-Index 1 und der letzte 6 (4) ist -1) * (6 -4) = 6
Erklären Sie, dass 4-1 bca (Nr. 234) und 6-4 ab (Nr. 45) entspricht
. Die Teilzeichenfolgen mit bca als Startposition und ba als Ende Position Alle enthalten nur das 4. a, und es ist ein Teilstring
, der nur das 4. a enthält , dh bca bcab ca cab a ab.
Beachten Sie, dass am Anfang möglicherweise nicht derselbe Buchstabe vorher oder nachher steht

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

ich

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Finde den Bereich des überlappenden Teils der Ellipse und des Dreiecks, vergib mir nicht

J.

Fügen Sie hier eine Bildbeschreibung ein
Fügen Sie hier eine Bildbeschreibung ein
Uh uh uh, immer noch nein,
wer wird mich lehren orz

Ich denke du magst

Origin blog.csdn.net/m0_54621932/article/details/114024665
Empfohlen
Rangfolge