这题不想说什么,循环判断一下有没有2就行,有2就计数。(为了省事,就写在主函数里了)
#include
#include
#include
#include
using namespace std;
int main(){
int count = 0;
for(int i=1;i<=2020;i++){
int bp = i;
while(bp){
if((bp % 10)==2) count++;
bp /= 10;
}
}
cout<<count<<endl;
return 0;
}
答案:624
这题考的是辗转相除,也叫欧几里得公式。(附上一个模板)题意没说分子分母不能相等,所以第二重循环也从1开始。
//欧几里得公式(辗转相除法)得最小公因数
int gcd(int a, int b)
{
return b ? gcd(b, a % b) : a;
}
#include
#include
#include
#include
using namespace std;
int gcd(int a,int b){
return b ? gcd(b,a%b) : a;
}
int main(){
int count=0;
for(int i=1;i<=2020;i++){
for(int j=1;j<=2020;j++){
if(gcd(i,j)==1) count++;
}
}
cout<<count<<endl;
}
答案:2481215
不得不说这题是挺蛇皮的。 这题我用了点小脑筋,对于(i,i)这个点,它的第一行的对应坐标是(2i - 1,0),那么题目也就替换成了找到第一行第39个数多少就可以求出(20,20)。那么我们就只需要找到第一行的规律就行,他们之间的差为1,4,1,8,1,12…是不是发现奇数是加1,偶数是加一个4的倍数呢。然后发现第一行第39个数是末尾,所以再减去19就可以得到答案了。
#include
#include
#include
#include
using namespace std;
int main(){
int x=1;
for(int i=2,count=4;i<=39;i++){
if(i%2==1) x++;
else{
x+=count;
count+=4;
}
}
cout<<(x-19)<<endl;
}
#include
#include
#include
#include
using namespace std;
int mon[13]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
int isr(int n){
if(n%4==0&&n%100!=0) return true;
if(n%400==0) return true;
return false;
}
int main(){
int count=0;//保存结果
int date=6;//记录是星期几,判断是否是月初的条件,我把它放在循环中,如果d是1,那么就是月初
//第一层循环,循环年数,还得判断是否是闰年,如果是闰年2月得+1
for(int y=2000;y<=2020;y++){
//第二层循环,循环月数
//如果是闰年,二月是29天
if(isr(y)==1) mon[2]++;
for(int m=1;m<=12;m++){
//第三层循环,循环天数
for(int d=1;d<=mon[m];d++){
//如果是月初或是星期一就跑2km,否则跑1km
if(date==1||d==1) count+=2;
else count++;
if(date==7) date=1;
else date++;
if(y==2020&&m==10&&d==1){
cout<<count<<endl;
return 0;
}
}
}
//对二月进行一个状态回归
if(isr(y)==1) mon[2]--;
}
return 0;
}
答案:8879
这题我是数出来的。谁叫他是填空题呢。 啊哈哈。
1根管:7种情况。(只有一个亮)
2根管:10种情况。(只用两个亮)
3根管:16种情况。
4根管:20种情况。
5根管:19种情况。(反向思维:不能选两个对着的,否则他俩中间的会断掉,只有fb和ec这两组断了就会有一个被隔离,而ag和gd不会,所以C53 - 2就行)
6根管:7种情况。(反向思维:选一个不亮就行)
7根管:1种情况。
答案:80
水题似乎没什么好讲的,C++似乎自身不带进一操作,这里结果做个进一操作即可。
#include
#include
#include
#include
using namespace std;
int n;
int main(){
cin>>n;
int count1=0; //及格人数
int count2=0; //优秀人数
for(int i=0;i<n;i++){
int tmp;
cin>>tmp;
if(tmp>=60) count1++;
if(tmp>=85) count2++;
}
int re1,re2;
re1 = ((count1 * 1.0 / n) + 0.005) * 100;
re2 = ((count2 * 1.0 / n) + 0.005) * 100;
printf("%d\%\n%d\%\n",re1,re2);
return 0;
}
这题也是道暴力模拟题,把每个值取出来做个判断即可。就是如此粗暴
#include
#include
#include
#include
using namespace std;
int ys,yd;
int ans=0;
int datemp[]={
0,31,28,31,30,31,30,31,31,30,31,30,31};
//判断是否为闰年
bool judge(int n){
if((n%4==0&&n%100!=0)||n%400==0) return 1;
else return 0;
}
//检查年份是否可以回文
bool check(int n){
int a,b,c,d;
int year=n;
a=n%10;
n/=10;
b=n%10;
n/=10;
c=n%10;
n/=10;
d=n%10;
int month,date;
month=a*10+b;
date=c*10+d;
if(month>12||date>31){
return 0;
}
else if(judge(year)){
if(month==2&&date<=29) return 1;
else return date<=datemp[month];
}
else return date<=datemp[month];
}
int get(int n){
int year=n;
int a,b,c,d;
a=n%10;
n/=10;
b=n%10;
n/=10;
c=n%10;
n/=10;
d=n%10;
return year*10000+a*1000+b*100+c*10+d;
}
int main(){
cin>>ys>>yd;
int n,m;
n=ys/10000;
m=yd/10000;
for(int i=n;i<=m;i++){
if(check(i))
if(get(i)>=ys&&get(i)<=yd) ans++;
}
cout<<ans<<endl;
return 0;
}
这题看似是一道字符串题目,本质却是一道动态规划。(个人感觉最近蓝桥杯越来越偏向动态规划了。)
此题的解题姿势是“竖着看”。
(字丑勿喷,谢谢您了)
#include
#include
#include
#include
using namespace std;
typedef long long ll;
ll dp[26]={
0};
int main()
{
string s;
cin>>s;
int n=s.length();
ll sum=0;
for(int i=0;i<n;i++){
int t=s[i]-'a';
sum+=(i+1-dp[t]) * (n-i);
dp[t]=i+1;
}
cout<<sum<<endl;
return 0;
}
注意一下,可能需要定义longlong型,极大可能超过int型