HUEL_ACM蓝桥杯练习

第十一届蓝桥杯大赛软件类省赛第二场补题

C++ B组

A

#include<iostream>
#include<algorithm>

using namespace std;

int main()
{
	int cnt = 0;
	for(int i = 1; i<=2020; i++)
	{
		int a = i;
		while(a)
		{//判断每个数字2中的数量 
			if(a%10==2) cnt++;
			a/=10;
		}
		
	}
	
	cout<<cnt<<endl;
	
	return 0;
 } 

B

#include<iostream>
#include<algorithm>

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<<endl;
	
	return 0;
}


//ans==2481215

C

#include<iostream>
#include<algorithm>

using namespace std;
const int N = 500;

int a[N][N]; 
//ans = 761;
int main()
{
	a[1][1] = 1;
	int ans = 2;
	for(int i = 2; i<=50 ; i++)
	{
		if(i%2==0)
		{//偶数从右上到坐下 
			for(int o = 1, j = i; o<=i; o++, j--)
				a[o][j] = ans++;
					
		}
		else 
		{//奇数从左下到右上 
			for(int o = i,j = 1; o>=1; o--,j++)	
				a[o][j] = ans++;
					
		}
	}
	cout<<a[20][20]<<endl;
	return 0;
}

D

#include<iostream>
#include<algorithm>

using namespace std;
 
int n,y,r,w; //年  月  日  周几 
int ans;

bool run(int a)//判断闰年 
{
	if(a%400==0) return true;
	if(a%4==0&&a%100!=0) return true;
	
	return false;
 }  
	
int main()
{
	n = 2000;
	y = 1;
	r = 1;
	w = 6;
	int d[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	while(n!=2020||y!=10||r!=1)//没有算 2020 10 1 ;最后要记得加上这天的数量 
	{
		if(run(n)) d[2] = 29;
		else d[2] = 28;
		
		if(r==1||w==1) ans += 2;
		else ans++;
		
		r++, w++;
		if(w>7) w = 1;
		if(r>d[y]) r = 1, y++;
		if(y>12) y = 1, n++;
	}
	
	ans += 2; 
	
	cout<<ans<<endl;
	
	return 0;
	
}

E

#include<iostream>
#include<algorithm>
#include<set>

using namespace std;

const int N = 10;

int map[N][N];
set<set<int> > sum;
int ans;
bool st[N];

void dfs(int a, set<int> mid)
{
	if(!sum.count(mid) ) sum.insert(mid);
	if(mid.size() == 7) return ;
	for(int i = 0; i<7; i++)
	{
		if(map[a][i]==1&&!st[i])
		{
			mid.insert(i); 
			st[i] = true;
			dfs(i,mid);
			st[i] = false;
			mid.erase(i); 
		}
	 } 
}

void add(int a, int b)
{
	map[a][b] = 1;
	map[b][a] = 1;
}

int main()
{
	add(0,1), add(0,5);
	add(6,1), add(6,5);
	add(6,2), add(6,4);
	add(5,4), add(1,2);
	add(4,3), add(3,2);
	
	for(int i = 0; i<7; i++)
	{
		set<int> s;
		s.insert(i); 
		st[i] = true;
		dfs(i,s);
		st[i] = false;
		s.erase(i); 
	}
	
	cout<<sum.size() <<endl;
	
	return 0;
}

F

#include<iostream>
#include<algorithm>
#include<cmath> 

using namespace std;

double n;
double cnt;
double j;
double u;

int main()
{
	cin>>n;
	double x = n;
	while(x--)
	{
		double a;
		cin>>a;
		if(a>=60) j++;
		if(a>=85) u++;
	}
	//cout<<n<<endl;
//	cout<<(j*100)/n<<"___"<<(u*100)/n;
	double ans1 = (j*100)/n, ans2 = (u*100)/n;
	double yu1 = fmod(ans1,1), yu2 = fmod(ans2,1);
	//if(yu1>=0.5) ans1 ++;
	//if(yu2>=0.5) ans2++;
	
	printf("%.0lf%\n",ans1);
	printf("%.0lf%\n",ans2);
	
	
	return 0;
}

G

#include<iostream>
#include<algorithm>

using namespace std;

int n,y,r;
int a;
int ans1; //  回文 
int ans2; //  ABABBABA

bool run(int a)
{
	if(a%400==0) return true;
	if(a%4==0&&a%100!=0) return true;
	
	return false;
 }  

bool check1(int a, int b, int c)
{
	int n1 = a/1000, n2 = a/100%10, n3 = a/10%10, n4 = a%10;
	int y1 = b/10, y2 = b%10;
	int r1 = c/10, r2 = c%10;
	
	if(n1==r2)
		if(n2==r1)
			if(n3==y2)
				if(n4==y1)
					return true;
	
	return false;
}
	
bool check2(int a, int b, int c)
{
	int n1 = a/1000, n2 = a/100%10, n3 = a/10%10, n4 = a%10;
	int y1 = b/10, y2 = b%10;
	int r1 = c/10, r2 = c%10;
	
	if(n1!=n2)
	if(n1==n3&&n3==y2&&y2==r2)
		if(n2==n4&&n4==y1&&y1==r1)
			return true;
	
	return false;
}
	
int main()
{
	cin>>a;
	n = a/10000;
	y = a/100%100;
	r = a%100;
	r++;
	int d[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
	
	int f1=1, f2=1;
	while(f1||f2)
	{
		if(y>12) y=1, n++;
		if(y==2) 
		{
			if(run(n)) d[y]=29;
			else d[y] = 28;
		}
		for(int i = r; i<=d[y];i++)
		{
			if(check1(n,y,i)&&f1) 
			{
				ans1 = n*10000+y*100+i;
				f1=0;
			}
			if(check2(n,y,i)&&f2)
			{
				ans2 = n*10000+y*100+i;
				f2=0;
			}
		}
		r = 1;
		y++;
	}
	cout<<ans1<<endl<<ans2<<endl;
	
	return 0;
	
}

H

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>

using namespace std;

const int N = 1e5 + 10;

char a[N];
int ans;
int p[30];

int main()
{
	scanf("%s",a+1);
	
	int n = strlen(a+1);
	
	for(int i = 1; i<=n; i++)
	{//当前字母上一次出现的位置  当前字母距离末尾的距离 
		ans += (i-p[a[i]-'a']) * (n-i+1);
		p[a[i]-'a'] = i;
	 } 
	 
	 cout<<ans<<endl;
	 return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值