(1) 1508 [蓝桥杯2020初赛] 门牌制作 http://oj.ecustacm.cn/problem.php?id=1508
?
#include
#include
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
#include
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
#include
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
#include
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
#include
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
#include
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
#include
#define debug(var) cout<< #var << " = " << var << endl
#include
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
#include
#include
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
#include
#include
#include
#define int long long
using namespace std;
vectorvs[200];
char a[200000];
signed main()
{
scanf("%s",a);
int L=strlen(a);
for(int i=0; i
(9) 1524 [蓝桥杯2020初赛] 平面切分 http://oj.ecustacm.cn/problem.php?id=1524
(10)1521: [蓝桥杯2020初赛] 字串排序 http://oj.ecustacm.cn/problem.php?id=1521