[蓝桥杯2020初赛]

(1) 1508 [蓝桥杯2020初赛] 门牌制作 http://oj.ecustacm.cn/problem.php?id=1508

?
#include<stdio.h>
#include<algorithm>
using namespace std;
int ans=0;
void dd(int x)
{
	while(x)
	{
		if(x%10==2) ans++;
		x/=10;
	}/*拆出每一位*/
}
int main()
{
	for(int i=1; i<=2020; i++)
	{
		dd(i);
	}
	printf("%d",ans);
	return 0;
}

?

(2) 1509 [蓝桥杯2020初赛] 既约分数 http://oj.ecustacm.cn/problem.php?id=1509

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int ans=0,i,j;
	for( i=1; i<=2020; i++)
	{

		for( j=1; j<= 2020; j++)
		{
			if( __gcd(i,j)==1 )
				ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

(3) 1510 [蓝桥杯2020初赛] 蛇形填数 http://oj.ecustacm.cn/problem.php?id=1510

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int n=20;
//	printf("%d",2*n*n-2*n+1);
	int ans=1,t=4;
	for(int i=1; i<=19; i++)
	{
		ans+=t;
		t+=4;
	}
	printf("%d",ans);
	return 0;
}

(4) 1513   [蓝桥杯2020初赛] 跑步锻炼 http://oj.ecustacm.cn/problem.php?id=1513

#include<stdio.h>
#include<algorithm>
using namespace std;
/*
1   2   3   4   5   6   7   8   9   10   11   12
31, 28, 31, 30 ,31, 30 ,31 ,31, 30, 31,  30 , 31
*/
int month[13]= {0,31, 28, 31, 30 ,31, 30 ,31 ,31, 30, 31,  30 , 31};
bool pan(int year)
{
	return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));
}
int main()
{
	int y,m,d;
	int ans=0,sum=0;
	
	for(y=2000; y<=2020; y++)
	{
		if(pan(y)) month[2]=29;
		else month[2]=28;
		for(m=1; m<=12; m++)
		{
			for(d=1; d<=month[m]; d++)
			{
				sum++;
				if((sum+5)%7==1||d==1) ans++;
				if(y==2020&&m==10&&d==1)
				{
				//	printf("%d ",(sum+5)%7);/*检验答案*/
					printf("%d",sum+ans);
					return 0;
				}
			}
		}
	}
	return 0;
}

(5) 1511    [蓝桥杯2020初赛] 七段码    http://oj.ecustacm.cn/problem.php?id=1511

并查集 ,建图,暴力枚举(可以二进制枚举)

#include<stdio.h>
#include<algorithm>
using namespace std;
int e[10][10],f[10],a[10];

void init(int n)/*初始化*/
{
	for(int i=1; i<=n; i++) f[i]=i;
}

int find(int x)/*找父亲节点*/
{
	if(f[x]!=x) return f[x]=find(f[x]);/*路径压缩,提高查找效率*/
	return x;
}

int bing(int x,int y)/*合并x,y*/
{
	int a1=find(x),b1=find(y);
	if(a1!=b1)  f[a1]=b1;
}

int main()
{
	e[1][2]=e[1][6]=1;
	e[2][1]=e[2][7]=e[2][3]=1;
	e[3][2]=e[3][7]=e[3][4]=1;
	e[4][5]=e[4][3]=1;
	e[5][6]=e[5][7]=e[5][4]=1;
	e[6][1]=e[6][5]=e[6][7]=1;
	e[7][6]=e[7][5]=e[7][2]=e[7][3]=1;/*邻边建图*/
	int ans=0,k,j,i;

	for(a[1]=0; a[1]<=1; a[1]++)
		for(a[2]=0; a[2]<=1; a[2]++)
			for(a[3]=0; a[3]<=1; a[3]++)
				for(a[4]=0; a[4]<=1; a[4]++)
					for(a[5]=0; a[5]<=1; a[5]++)
						for(a[6]=0; a[6]<=1; a[6]++)
							for(a[7]=0; a[7]<=1; a[7]++)
//	for(k=1; k<=(1<<7); k++)/*还可以用二进制枚举法:遍历1~128,将每一位二进制数拆开,a[1~7]分别对应二进制的每一位*/
							{
								/*	for(j=1; j<=7; j++)
									{
										a[j]=((k&(1<<(j-1)))!=0);
									}*/
								init(8);
								for(i=1; i<=7; i++)
								{
									for(j=i+1; j<=7; j++)
									{
										if(a[i]&&a[j]&&e[i][j])/*如果i和j都是亮着的且是邻边就并起来*/
											bing(i,j);
									}
								}
								int sum=0;
								for(i=1; i<=7; i++)
								{
									if(f[i]==i&&a[i]) sum++;/*在自己集合里做最终祖先的个数==集合个数*/
								}
								if(sum==1) ans++;
							}

	printf("%d",ans);
	return 0;
}


(6) 1517   [蓝桥杯2020初赛] 成绩分析 http://oj.ecustacm.cn/problem.php?id=1517

#include<stdio.h>
#include<algorithm>
using namespace std;
int main()
{
	int i,n,m,j,min1=1e9,max1=-1,sum=0;
	scanf("%d",&n);
	for(i=1; i<=n; i++)
	{
		int a1;
		scanf("%d",&a1);
		max1=max(max1,a1);
		min1=min(min1,a1);
		sum+=a1;
	}
	printf("%d\n%d\n%.2lf",max1,min1,1.0*sum/n);
	return 0;
}

(7) 1518    [蓝桥杯2020初赛] 回文日期 http://oj.ecustacm.cn/problem.php?id=1518

#include<stdio.h>
#include<bits/stdc++.h>
#define debug(var) cout<< #var << " = " << var << endl
#include<algorithm>
using namespace std;
/*
1   2   3   4   5   6   7   8   9   10   11   12
31, 28, 31, 30 ,31, 30 ,31 ,31, 30, 31,  30 , 31
*/

int month[13]= {0,31, 28, 31, 30 ,31, 30 ,31 ,31, 30, 31,  30 , 31};

bool pan(int year)
{
	return ((year % 400 == 0) || (year % 4 == 0 && year % 100 != 0));
}

int f=0;
bool pan(int y,int m,int d)
{
	int b[10];
	int k=0,i,j;
	for(i=8; i>=7; i--) b[i]=d%10,d/=10;
	for(i=6; i>=5; i--) b[i]=m%10,m/=10;
	for(i=4; i>=1; i--) b[i]=y%10,y/=10;
	if(!f)
	{
		for(i=1; i<=8; i++)
		{
			if(b[i]!=b[1+8-i]) break;
		}
		if(i==8+1)
		{
			for(i=1; i<=8; i++) printf("%d",b[i]);
			f=1;
			printf("\n");
		}
	}

	if(b[1]==b[3]&&b[1]==b[6]&&b[1]==b[8]&&b[2]!=b[1]&&b[2]==b[4]&&b[2]==b[5]&&b[2]==b[7])
	{
		for(i=1; i<=8; i++) printf("%d",b[i]);
		printf("\n");
		return 1;
	}
	return 0;
}

void solve()
{
	int y,m,d,Y=0,M=0,D=0,i,j;
	char a[100];
	scanf("%s",a+1);
	f=0;
	for(i=1; i<=4; i++) Y=Y*10+a[i]-'0';
	for(i=5; i<=6; i++) M=M*10+a[i]-'0';
	for(i=7; i<=8; i++) D=D*10+a[i]-'0';
	//debug(Y),debug(M),debug(D);
	for(y=Y;y<= 8999; y++)
	{
		if(pan(y)) month[2]=29;
		else month[2]=28;
		for(m=(y==Y)?M:1; m<=12; m++)
		{
			for(d=(m==M&&y==Y)?D:1; d<=month[m]; d++)
			{
				if(y==Y&&m==M&&D==d) continue;
				if(pan(y,m,d)) return;
			}
		}
	}
}
char a[100];
int main()
{
	int T;
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}

(8) 1519   [蓝桥杯2020初赛] 子串分值 http://oj.ecustacm.cn/problem.php?id=1519

暴力代码O((n3))/*直接枚举每个子区间*/

#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int num[30];
char a[100100];
int main()
{
	int i,l,r,ans=0;
	scanf("%s",a+1);
	int n=strlen(a+1);
	for( l=1; l<=n; l++)
	{
		for(r=l; r<=n; r++)
		{
			for( i=0; i<=27; i++) num[i]=0;
			for( i=l; i<=r; i++)
			{
				num[a[i]-'a']++;
			}
			for( i=l; i<=r; i++) ans+=(num[a[i]-'a']==1);
		}
	}
	printf("%d",ans);
	return 0;
}

满分解法O(n)

思路:换个角度考虑每个字母在哪些子串中只出现一次。

找到离这个字母最近的相同字母的下标

比如abcabbba这个串中的第二个a:就在(2+1)*(3+1)个子串中只出现一次

解释:在它左边可以扩展0 ,1 , 2 个长度右边可以扩展0,1,2,3个长度

根据乘法原理 总共(2+1)*(3+1)个,因此这个a的贡献值就是12

实现代码:


#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<vector>
#define int long long 
using namespace std;
vector<int >vs[200];
char a[200000];
signed main()
{
	scanf("%s",a);
	int L=strlen(a);
	
	for(int i=0; i<L; i++)
		vs[a[i]].push_back(i);/*存下每个字母都出现在哪些位置*/
	
	int ans=0;
	for(char i='a'; i<='z'; i++)
	{
		if(vs[i].size())
		{
			int l,r;
			for(int j=0; j<vs[i].size(); j++)
			{
				if(j==0) l=vs[i][j]-0;
				else l=vs[i][j]-vs[i][j-1]-1;
				if(j==vs[i].size()-1) r=L-1-vs[i][j];
				else r=vs[i][j+1]-vs[i][j]-1;/*算出左右可可以扩展的最大长度*/
				ans+=(l+1)*(r+1);/*本位置的贡献值*/ 
			}
		}
	}
	printf("%lld",ans);
}

(9) 1524   [蓝桥杯2020初赛] 平面切分 http://oj.ecustacm.cn/problem.php?id=1524

(10)1521: [蓝桥杯2020初赛] 字串排序 http://oj.ecustacm.cn/problem.php?id=1521

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值