2020年蓝桥杯省赛c/c++B组

1、门牌制作

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int main(){
    int count=0,x;
    cin>>x;
    for(int i=1;i<=x;i++){
        while(i>0){
            if(i%10==2)
            count++;
            i/=10;
        } 
    }
    cout<<count<<endl;
}

输出:624

2、既约分数

#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int gcd(int a,int b){
    if(a%b==0)
    return b;
    return gcd(b,a%b);
}
int main(){
    int num=0;
    for(int i=1;i<=2020;i++){
        for(int j=i+1;j<=2020;j++){
            if(gcd(i,j)==1){
                num++;
            }
        } 
    }
    cout<<num*2+1<<endl;
    return 0; 
}

输出:2481215

3、蛇形填数

可以看成一个三角形。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
    int n=38;  //可以看成一个三角形第20列为2*20-1,n记录之前的行数 
    int sum=(1+n)*n/2;  //先将所在列之前行数求出
    sum+=39/2+1;
    cout<<sum<<endl; 
}

输出:761

4、七段码

图论,并查集

将每一个灯管看作节点连边建图,然后dfs搜索所有的状态,判断每一个状态是否可行

#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
int a[30]={0},e[10][10],f[10],ans=0;
int n=7;
//先建图
//a b c d e f g
//1 2 3 4 5 6 7
void init(){
    e[1][2]=e[1][6]=1;
    e[2][1]=e[2][7]=1;
    e[6][1]=e[6][7]=1;
    e[7][2]=e[7][6]=e[7][5]=e[7][3]=1;
    e[5][7]=e[5][4]=1;
    e[3][7]=e[3][4]=1;
    e[4][3]=e[4][5]=1;    
    e[2][3]=e[3][2]=1;
    e[5][6]=e[6][5]=1;
}
int find(int x){
    if(x!=f[x]){
        return f[x]=find(f[x]);
    }
    return f[x];
}
void dfs(int u,int v,int m){
    if(u==m){
        for(int i=1;i<10;i++){
            f[i]=i;
        }
        for(int i=0;i<m;i++){
            for(int j=i+1;j<m;j++){
                if(e[a[i]][a[j]]==1){
                    f[find(a[i])]=find(f[a[j]]);
                }                
            }            
        }
        bool xx=0;
        for(int i=0;i<m-1;i++){
            if(find(a[i])!=find(a[i+1])){
                xx=true;
                break;
            }
        }
        if(!xx){
            ans++;
        }
        return ;
    }
    for(int i=v;i<=n;i++){
        a[u]=i;
        dfs(u+1,i+1,m);
    }
}
int main(){
    init();
    memset(f,0,sizeof(f));
    for(int i=1;i<=n;i++){
        dfs(0,1,i);
    }
    cout<<ans<<endl;
    return 0;
} 

输出:80

5、跑步锻炼

遍历枚举,主要闰年2月份,各个月份大小,之后就可以求出结果了

#include<iostream>
#include<algorithm>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    int year1=2000,year2=2020,month1=1,month2=10,day1=1,day2=1;
    int week=6;
    long long int sum=0;
    for(year1;year1<=year2;year1++){
        if((year1%400==0)||(year1%4==0&&year1%100!=0)){
            months[2]=29;
        }
        else
        months[2]=28;
        for(int i=1;i<=12;i++){
            for(int day=1;day<=months[i];day++){
                if(day==1||week==1){
                    sum+=2;
                }
                else{
                    sum+=1;
                }
                week=(week+1)%7;
                if(year1==2020&&i==10&&day==1){
                    cout<<sum<<endl;
                    return 0;
                }
            }
        }
    }
    return 0;
}

输出:8879

6、回文日期

还不会

7、字串排序

还没学会

8、成绩统计

#include<iostream>
using namespace std;
int main()
{
    int n;
    double a=0,b=0;
    cin>>n;
    int x;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(x>=60) a++;
        if(x>=85) b++;
    }
    int c=a/(n/100.0)+0.5;
    int d=b/(n/100.0)+0.5;   //因为四舍五入,所以加0.5 
    cout<<c<<"%"<<endl<<d<<"%"<<endl;
     return 0;
}

9、子串分值和

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int n,x[600];
string s;
main(){
    int sum=0;
    cin>>s;
    n=s.size();
    s=" "+s;
    for(int i=1;i<=n;i++){
        sum+=(i-x[s[i]])*(n-i+1);
        x[s[i]]=i;
    } 
    cout<<sum<<endl;
    return 0;
}

10、平面切分

一开始不是很清楚,后来看了一些大佬的思路才知道,但还是有些不理解

可以知道每增加一条直线,对平面数的贡献值是其与先前直线的交点数(不重合)+1

#include<bits/stdc++.h>
using namespace std;
const int N=1010;
int main()
{
    int n;
    cin>>n;
    int a,b;
    long long ans=2;  
    long double A[N],B[N];
    pair<long double,long double> p; 
    set<pair<long double,long double> > s;  
    for(int i=0;i<n;i++){
        cin>>a>>b;
        p.first=a;
        p.second=b;
        s.insert(p);
    }
    int i=0;  
    for(set<pair<long double, long double> >::iterator it=s.begin();it!=s.end();it++,i++){
        A[i]=it->first;
        B[i]=it->second;
    }
    for(int i=1;i<s.size();i++){
        set<pair<long double, long double> > pos;  
        for(int j=i-1;j>=0;j--){
            int a1=A[i],b1=B[i];
            int a2=A[j],b2=B[j];
            if(a1==a2)  
                continue; 
            p.first=1.0*(b2-b1)/(a1-a2);
            p.second=1.0*a1*((b2-b1)/(a1-a2))+b1;
            pos.insert(p); 
        }
        ans+=pos.size()+1;  
    } 
    printf("%d\n",ans);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值