美文网首页
蓝桥杯 C/C++ A组省赛

蓝桥杯 C/C++ A组省赛

作者: 恰似一碗咸鱼粥 | 来源:发表于2019-03-13 20:26 被阅读0次

2018

第一题

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
    long x=pow(2,19);
    printf("%d/%d",x*2-1,x);
    return 0;
}

答案:1048575/524288


第二题

蓝桥杯好像很喜欢考闰年相关的题....
闰年分为普通闰年和世纪闰年:
普通闰年:能被4整除但是不能被100整除
世纪闰年:能被400整除

#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;


int main()
{
    int d=0;
    for(int i=1901;i<=2000;++i){
        if((i%4==0&&i%100!=0)||(i%400==0)){
            d+=366;
        }else d+=365;
    }
    printf("%d",d/7);
    return 0;
}

答案:5217


第三题

给定一堆数相乘,问结尾有多少个0
由于一个0由一个2和一个5组成,所以只需求这些数里2和5的总个数取最小值即可

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;


int main()
{
    int num2=0,num5=0,temp;
    for(int i=0;i<100;++i){
        cin>>temp;
        while(temp%2==0){
            temp/=2;
            num2++;
        }
        while(temp%5==0){
            temp/=5;
            num5++;
        }
    }
    cout<<min(num2,num5);
    return 0;
}

答案:31


第四题

与丑数类似,dp即可
但是反正代码又不提交,暴力解决也行

#include <stdio.h>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;

ll minest(ll a,ll b,ll c){
    return min(min(a,b),c);
}

int main()
{
    ll temp;
    int p3=0,p5=0,p7=0;
    cin>>temp;
    ll dp[10000];
    dp[0]=1;
    for(int i=1;i<3000;++i){
        dp[i]=minest(dp[p3]*3,dp[p5]*5,dp[p7]*7);
        if(dp[i]==dp[p3]*3)p3++;
        if(dp[i]==dp[p5]*5)p5++;
        if(dp[i]==dp[p7]*7)p7++;
        if(dp[i]==temp){
            cout<<i;
            return 0;
        }
    }
    return 0;
}

答案:1905


第五题

肯定和size有关,莽就是了
答案:size/3


第六题

简单的模拟,对经历过pat的人来说不算啥的啦~
把来回的用时相加除以二就是答案了

#include <stdio.h>
#include <iostream>
#define charToNum(x) (x-'0')
using namespace std;

int main()
{
    int N;
    scanf("%d",&N);
    for(int i=0;i<N;++i){
        char c;
        int sum;
        int h1,m1,s1,t1;
        int h2,m2,s2,t2;
        scanf("%d:%d:%d",&h1,&m1,&s1);
        scanf("%d:%d:%d",&h2,&m2,&s2);
        t1=h1*3600+m1*60+s1;
        t2=h2*3600+m2*60+s2;
        while((c=getchar())!='\n'){
            if(c=='1'||c=='2'||c=='3'){
                t2+=charToNum(c)*24*3600;
            }
        }
        int h3,m3,s3,t3;
        int h4,m4,s4,t4;
        scanf("%d:%d:%d",&h3,&m3,&s3);
        scanf("%d:%d:%d",&h4,&m4,&s4);
        t3=h3*3600+m3*60+s3;
        t4=h4*3600+m4*60+s4;
        while((c=getchar())!='\n'){
            if(c=='1'||c=='2'||c=='3'){
                t4+=charToNum(c)*24*3600;
            }
        }
        sum=(t2+t4-t1-t3)/2;
        printf("%02d:%02d:%02d\n",sum/3600,(sum%3600)/60,sum%3600%60);
    }
    return 0;
}

题目七

网上好像说满分要用线段树?先溜了溜了


第九题

暴力解法...应该是拿不了满分的

#include <iostream>
#include <stdio.h>
using namespace std;

int main() {
    int n,k,max=0,sum;
    int save[100000];
    scanf("%d%d",&n,&k);
    for(int i=0;i<n;++i){
        scanf("%d",&save[i]);
    }
    for(int i=0;i<n;++i){
        for(int j=i+1;j<n;++j){
            for(int k=j+1;k<n;++k){
                sum=save[i]+save[j]+save[k];
                if(sum%k==0&&sum>max){
                    max=sum;
                }
            }
        }
    }
    printf("%d",sum);
    return 0;
}

2017

第一题

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <string>
using namespace std;

int cnt=0;
bool vis[10][10];
string pather[10];

void dfs(int x,int y){
    if(x<0||x>9||y<0||y>9){
        cnt++;
        return;
    }
    if(vis[x][y])return;
    vis[x][y]=true;
    if(pather[x][y]=='L')y--;
    else if(pather[x][y]=='R')y++;
    else if(pather[x][y]=='U')x--;
    else if(pather[x][y]=='D')x++;
    dfs(x,y);
}

int main() {
    char c;
    for(int i=0;i<10;++i){
        cin>>pather[i];
    }
    for(int i=0;i<10;++i){
        for(int j=0;j<10;++j){
            memset(vis,0,sizeof(vis));
            dfs(i,j);
        }
    }
    cout<<cnt;
    return 0;
}

答案:31


2016

第一题

枚举一下即可
答案:7

#include <iostream>
using namespace std;

int main() {
    int father=28;
    int son=1,cnt=0;
    for(;father<99;father++,son++){
        if(father%10==son/10&&father/10==son%10){
            cnt++;
        }
    }
    cout<<cnt;
    return 0;
}

第二题

枚举就行了 答案为26

#include <iostream>
using namespace std;

int main() {
    int age=1,flag;
    for(;age<=100;age++){
        for(int i=1;i<=age;++i){
            int sum=0;
            for(int j=i;j<=age;++j){
                sum+=j;
            }
            if(sum==236){
                cout<<i;
                return 0;
            }
        }
    }
    return 0;
}

第六题

答案:64

#include <iostream>
#include <string.h>
using namespace std;


int main() {
    int cnt=0;
    for(int i=1;i<13;++i){
        for(int j=i+1;j<=13;++j){
            bool vis[14];
            if(i+j<=13){
            vis[i]=true,vis[j]=true,vis[i+j]=true;
            for(int k=1;k<13;++k){
                for(int m=k+1;m<=13;++m){
                    if(!vis[k]&&!vis[m]&&!vis[m-k]&&m-k!=k){
                        vis[m]=true,vis[k]=true,vis[m-k]=true;
                        for(int t=1;t<13;++t){
                            for(int z=t+1;z<=13;++z){
                                if(!vis[t]&&!vis[z]&&t*z<=13&&!vis[t*z]&&t*z!=t&&t*z!=z){
                                    vis[t]=true,vis[z]=true,vis[t*z]=true;
                                    for(int s=1;s<13;++s){
                                        for(int y=s+1;y<=13;++y){
                                            if(!vis[s]&&!vis[y]&&y%s==0&&!vis[y/s]&&y/s!=s&&y/s!=y){
                                                cout<<i<<" "<<j<<" "<<j-i<<" "<<k<<" "<<m<<" "<<m-k<<" "<<t<<" "<<z<<" "<<t*z<<" "<<s<<" "<<y<<" "<<y/s<<endl; 
                                                cnt++;
                                            }
                                        }
                                    }
                                    vis[t]=false,vis[z]=false,vis[t*z]=false;
                                }
                            }
                        }
                        vis[m]=false,vis[k]=false,vis[m-k]=false;
                    }
                }
            }
            vis[i]=false,vis[j]=false,vis[i+j]=false;
            } 
        }
    }
    cout<<cnt*4;
    return 0;
}

第八题

#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;

void solve(int n){
    for(int i=0;i*i<=n;++i){
        int n1=n-i*i;
        for(int j=0;j*j<=n1;++j){
            int n2=n1-j*j;
            for(int k=0;k*k<=n2;++k){
                int n3=n2-k*k;
                int l=sqrt(n3);
                if(l*l==n3){
                    printf("%d %d %d %d",i,j,k,l);
                    return;
                }
            }
        }
    }
}

int main() {
    int n;
    scanf("%d",&n);
    solve(n);
    return 0;
}

第九题

#include <iostream>
#include <math.h>
#include <string>
#include <algorithm>
using namespace std;


int main() {
    string s1,s2;
    cin>>s2;
    s1=s2;
    reverse(s2.begin(),s2.end());
    int dp[100][100];
    for(int i=0;i<10;++i){
        dp[i][0]=0;
        dp[0][i]=0;
    }
    int n=s1.length();
    for(int i=1;i<=n;++i){
        for(int j=1;j<=n;++j){
            if(s1[i-1]==s2[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;
            }else{
                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
            
        }
    }
    printf("%d",n-dp[n][n]);
    return 0;
}

2015

第一题

答案:10

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
    for(int i=1;i<100;++i){
        for(int j=i+1;j<100;++j){
            for(int k=j+1;k<100;++k){
                if(i*i+j*j+k*k==1000){
                    cout<<i<<endl;
                }
            }
        }
    }
    return 0;
}

第二题

直接excel操作就行了
=A1+1000


第三题

大概估算下数字的范围再枚举即可,答案:69

#include <iostream>
using namespace std;

void solve(int x){
    int b[10]={0};
    int a=x*x;
    int c=x*x*x;
    while(a){
        if(b[a%10]==0){
            b[a%10]++;
            a/=10;
        }else{
            return;
        }
    }
    while(c){
        if(b[c%10]==0){
            b[c%10]++;
            c/=10;
        }else{
            return;
        }
    }
    for(int i=0;i<10;++i){
        if(!b[i])return;
    }
    cout<<x<<endl;
}

int main(int argc, char** argv) {
    int x=10;
    for(;x<100;++x){
        solve(x);
    }
    return 0;
}

第六题

dfs即可,记得return得条件为depth==14而不是13
答案:3598180

#include <iostream>
using namespace std;
int cnt=0;
int card[15];
void dfs(int last,int depth){
    if(depth==14){
        cnt++;
        return;
    }
    for(int i=last;i<=13;++i){
        if(card[i]<4){
            card[i]++;
            dfs(i,depth+1); 
            card[i]--;
        }
    }
}

int main(int argc, char** argv) {
    dfs(1,1);
    cout<<cnt;
    return 0;
}

第八题

#include <iostream> 
using namespace std;
int buy;
void ans(int num){
    if(num/3==0){
        return;
    }
    buy+=num/3;
    return ans(num/3+num%3);
}

int main(int argc, char** argv) {
    
    cin>>buy;
    ans(buy);
    cout<<buy;
    return 0;
}

2013

第一题

答案:1799-7-16

#include <iostream>
using namespace std;

int main(int argc, char** argv) {
    int day=8113,i;
    for(i=1777;day>=365;++i){
        if((i%4==0&&i%100!=0)||i%400==0){
            day-=366;
        }else{
            day-=365;
        }
    } 
    cout<<i<<endl<<day;
    return 0;
}

第二题

答案:639172

#include <iostream>
#include <string.h>
using namespace std;

bool hs[10];
bool isok(long long x){
    memset(hs,0,sizeof(hs));
    while(x){
        if(!hs[x%10]){
            hs[x%10]=true;
            x/=10;
        }else{
            return false;
        }
    }
    return true;
}

int main(int argc, char** argv) {
    long long temp=100000,ans;
    for(;temp<999999;temp++){
        if(isok(temp)){
            bool flag=true;
            ans=temp*temp;
            while(ans&&flag){
                if(hs[ans%10]){
                    flag=false;
                }else{
                    ans/=10;
                }
            }
            if(flag){
                cout<<temp<<endl;
            }
        }
    } 
    return 0;
}

第三题

dfs,答案:35

#include <iostream>
using namespace std;

int cnt=0;
int a[4][5]={{0,1,2,3,4},{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7}};
void dfs(int x,int y){
    if(x==3&&y==4){
        cnt++;
        return;
    }
    if(x!=3){
        if(a[x+1][y]==a[x][y]+1)
            dfs(x+1,y);
    }
    if(y!=4){
        if(a[x][y+1]==a[x][y]+1)
            dfs(x,y+1);
    }
}

int main(int argc, char** argv) {
    dfs(0,0);
    cout<<cnt;
    return 0;
}

第五题

答案:9088

#include <iostream>
#include <vector>
#include <map>
using namespace std;
struct k{
    int price,ans,cut;
};
vector<k> more,les;
map<int,int> hs;
bool isok(int x){
    for(int i=0;i<4;++i){
        if(x%10==1||x%10==2||x%10==5||x%10==6||x%10==8||x%10==9||(i!=0&&x%10==0)){
            x/=10;
        }else{
            return false;
        }
    }
    return true;
}
int main(int argc, char** argv) {
    hs[1]=1,hs[2]=2,hs[5]=5,hs[9]=6,hs[8]=8,hs[6]=9,hs[0]=0;
    for(int i=1000;i<10000;++i){
        if(isok(i)){
            int ans=hs[i%10]*1000+hs[i%100/10]*100+hs[i%1000/100]*10+hs[i/1000];
            if(i-ans>200&&i-ans<300)les.push_back({i,ans,ans-i});
            if(ans-i>800&&ans-i<900)more.push_back({i,ans,ans-i});
        }
    }
    for(int i=0;i<les.size();++i){
        for(int j=0;j<more.size();++j){
            if(more[j].cut+les[i].cut==558){
                cout<<les[i].price<<endl;
            }
        }
    }
    return 0;
}

相关文章

网友评论

      本文标题:蓝桥杯 C/C++ A组省赛

      本文链接:https://www.haomeiwen.com/subject/nocxmqtx.html