赞
踩
提示:此题解为本人自己解决,如有差错请大家多多指正。
太菜了,太菜了,写个文章提醒我的菜,感觉受到了打击。自己还是菜,写的还不够多,一堆都忘了。dfs也不会写了。
可以暴力求解,数位为两位时,有11,22,33,44,55,66,77,88,99共9个幸运数。然后分别枚举(1000-9999,100000-999999,10000000~99999999)然后加上幸运数的条件算出每个数段的幸运数个数来,加起来就是答案。(我暴力还写错了,真是太菜了!!!痛苦,今年大一爆0,明年省一等我!!!)
更新一种做法统计1-9999有多少位数为多少的和
解法一:
#include<iostream>
using namespace std;
int main()
{
//数位为二:11,22,33,44,55,66,77,88,99:9种结果
int a=0,b=0,c=0,d=9;
for(int i=1000;i<=9999;i++)
{
if(i%10+i/10%10==i/100%10+i/1000%10)//个位+十位=百位+千位,下面依次类推
a++;//数位为四:结果为615
}cout<<a<<endl;
for(int i=100000;i<=999999;i++)
{
if(i%10+i/10%10+i/100%10==i/1000%10+i/10000%10+i/100000%10)
b++;
}cout<<b<<endl;
for(int i=10000000;i<=99999999;i++)
{
if(i%10+i/10%10+i/100%10+i/1000%10==i/10000%10+i/100000%10+i/1000000%10+i/10000000%10)
c++;
}
cout<<c<<endl;
cout<<d+a+b+c;//9+615+50412+4379055=4430091
return 0;
}
解法二:
#include <stdio.h>
int a[5][10000]={0};
void judge(int x)
{
int sum=0,i=0;
while(x>0){
sum+=x%10;
i++;
x/=10;
}
a[i][sum]++;
}
int main()
{
int count=0;
for(int i=1;i<=9999;i++)judge(i);
for(int i=1;i<=4;i++){
for(int j=1;j<=9*i;j++){
for(int k=1;k<=i;k++){
count+=a[i][j]*a[k][j];
}
}
}
printf("%d\n",count);
return 0;
}
本次蓝桥杯让我深刻意识到了我的菜,上学期也没咋学,这学期听了一点y总的课,知识点知道了不少,但就是转化不成代码,真的很痛苦。接下来继续学习算法和数据结构,多做题,同时学一些框架,不能太痴迷于算法题了不然可能会断了自己的路,看个人水平吧还是,对于我来说是这样,然后看看学校的ICPC队能不能进去(进不去,,,),下周还有新生赛。。。。。。好羡慕厉害的学长和算法大佬们。。。。。。。。。。。。。。。。。。。。写完题解释然了,感觉前几道好简单还做错了。。。。。。。。。。。。。。。。。。。。。明年省一等我
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。