蓝桥杯练习(二)

阶乘计算

问题描述
  输入一个正整数n,输出n!的值。
输入格式
  输入包含一个正整数n,n<=1000。
加粗样式输出格式
  输出n!的准确值。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4;
int a[maxn]={1};
int main(){
    int n,d,t=1;
    scanf("%d",&n);
    for(int i=2;i<=n;++i){
        d=0;
        for(int j=0;j<t;++j){
            a[j]=a[j]*i+d;
            d=a[j]/10;
            a[j]%=10;
        }
        while(d){
            a[t++]=d%10;
            d/=10;
        }
    }
    //printf("%d",t);
    for(int i=t-1;i>=0;--i)printf("%d",a[i]);
}

高精度加法

输入两个整数a和b,输出这两个整数的和。a和b都不超过100位。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e2+1;
int a[maxn]={0};
int b[maxn]={0};

void transfer(string &s,int c[]){
    int t=0;
    for(int i=s.size()-1;i>=0;--i){
        c[t++]=s[i]-'0';
    }
}

int main(){
   string s;
   cin>>s;
   transfer(s,a);
   cin>>s;
   transfer(s,b);
   int d=0;
   for(int i=0;i<maxn;++i){
       a[i]+=b[i]+d;
       if(a[i]>9){
           a[i]-=10;
           d=1;
       }else d=0;
   }
   for(int i=maxn-1;i>0;--i){
       if(a[i]!=0){
           for(int t=i;t>=0;--t){
               cout<<a[t];
           }
           return 0;
       }
   }
   cout<<0;
   return 0;
}

Huffuman树

问题描述
  Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。
  给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下:
  1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi} 中。这个过程的费用记为pa + pb。
  2. 重复步骤1,直到{pi}中只剩下一个数。
  在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。
  本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。
输入格式
  输入的第一行包含一个正整数n(n<=100)。
  接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。

#include<bits/stdc++.h>
using namespace std;

int main(){
    priority_queue<int,vector<int>,greater<int> > q;
    int n,d;
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        scanf("%d",&d);
        q.push(d);
    }
    int sum = 0;
    while(q.size()>1){
        d = q.top();q.pop();
        d+=q.top();q.pop();
        sum+=d;
        //printf("%d ",d);
        q.push(d);
    }
    printf("%d",sum);
}

2n皇后问题

问题描述
  给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。
输入格式
  输入的第一行为一个整数n,表示棋盘的大小。
  接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 10;
int g[maxn][maxn];// 1 可以放,0 不可以放 2,黑,3 白
int n,ans;
int row1[maxn];
int row2[maxn];

bool check(int t,int col,int row[]){
    for(int i=0;i<t;++i)
        if(row[i]==col||abs(i-t)==abs(row[i]-col))
            return false;
    
    return true;
}

void dfs(int i,int j,int row[]){
    if(i==n&&3==j){
        ans++;
        return;
    }
    if(i==n&&j==2){
        dfs(0,3,row2);
    }
    for(int t=0;t<n;++t){
        if(g[i][t]==1&&check(i,t,row)){
            row[i]=t;
            g[i][t]=j;
            dfs(i+1,j,row);
            g[i][t]=1;
        }
    }
}

int main(){
    scanf("%d",&n);
    for(int i=0;i<n;++i){
        for(int j=0;j<n;++j)scanf("%d",&g[i][j]);
    }
    dfs(0,2,row1);
    printf("%d",ans);
    return 0;
}

报时助手

问题描述
  给定当前的时间,请用英文的读法将它读出来。
  时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“three o’clock”。
  如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
  时和分的读法使用的是英文数字的读法,其中0~20读作:
  0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty。
  30读作thirty,40读作forty,50读作fifty。
  对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
  按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。
输入格式
  输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。

#include<bits/stdc++.h>
using namespace std;

string msg[] ={"zero","one","two","three","four","five","six","seven",
"eight","nine","ten","eleven","twelve","thirteen","fourteen","fifteen",
"sixteen","seventeen","eighteen","nineteen","twenty"};

int main(){
    int h,m;
    cin>>h>>m;
     if(h<21)cout<<msg[h];
     else  cout<<msg[20]<<" "<<msg[h-20];
    if(m==0){
        cout<<" o'clock";
    }else{
        cout<<" ";
        if(m<21)cout<<msg[m];
        else if(m<30)cout<<msg[20]<<" "<<msg[m-20];
        else if(m==30)cout<<"thirty";
        else if(m<40)cout<<"thirty"<<" "<<msg[m-30];
        else if(m==40)cout<<"forty";
        else if(m<50)cout<<"forty"<<" "<<msg[m-40];
        else if(m==50)cout<<"fifty";
        else cout<<"fifty "<<msg[m-50];
    }
}

回形取数

问题描述
  回形取数就是沿矩阵的边取数,若当前方向上无数可取或已经取过,则左转90度。一开始位于矩阵左上角,方向向下。
输入格式
  输入第一行是两个不超过200的正整数m, n,表示矩阵的行和列。接下来m行每行n个整数,表示这个矩阵。

#include<bits/stdc++.h>
using namespace std;

const int MAXN = 202;
int a[MAXN][MAXN];
int n,m;
int main(){
    scanf("%d%d",&n,&m);
    for(int i=0;i<n;++i){
        for(int j=0;j<m;++j){
            scanf("%d",&a[i][j]);
        }
    }
    int l=0,r=m-1,t=0,d=n-1;
    vector<int> ans;
    while(l<=r&&t<=d){
        for(int i=t;i<=d;++i)ans.push_back(a[i][l]);
        l++;
        if(ans.size()==n*m)break;
        for(int i=l;i<=r;++i)ans.push_back(a[d][i]);
        d--;
        if(ans.size()==n*m)break;
        for(int i=d;i>=t;--i)ans.push_back(a[i][r]);
        r--;
        if(ans.size()==n*m)break;
        for(int i=r;i>=l;--i)ans.push_back(a[t][i]);
        t++;
        if(ans.size()==n*m)break;
    }
    for(int i=0;i<ans.size()-1;++i)printf("%d ",ans[i]);
    printf("%d",ans[ans.size()-1]);
}

龟兔赛跑预测

问题描述
  话说这个世界上有各种各样的兔子和乌龟,但是研究发现,所有的兔子和乌龟都有一个共同的特点——喜欢赛跑。于是世界上各个角落都不断在发生着乌龟和兔子的比赛,小华对此很感兴趣,于是决定研究不同兔子和乌龟的赛跑。他发现,兔子虽然跑比乌龟快,但它们有众所周知的毛病——骄傲且懒惰,于是在与乌龟的比赛中,一旦任一秒结束后兔子发现自己领先t米或以上,它们就会停下来休息s秒。对于不同的兔子,t,s的数值是不同的,但是所有的乌龟却是一致——它们不到终点决不停止。
  然而有些比赛相当漫长,全程观看会耗费大量时间,而小华发现只要在每场比赛开始后记录下兔子和乌龟的数据——兔子的速度v1(表示每秒兔子能跑v1米),乌龟的速度v2,以及兔子对应的t,s值,以及赛道的长度l——就能预测出比赛的结果。但是小华很懒,不想通过手工计算推测出比赛的结果,于是他找到了你——清华大学计算机系的高才生——请求帮助,请你写一个程序,对于输入的一场比赛的数据v1,v2,t,s,l,预测该场比赛的结果。
输入格式
  输入只有一行,包含用空格隔开的五个正整数v1,v2,t,s,l,其中(v1,v2<=100;t<=300;s<=10;l<=10000且为v1,v2的公倍数)

#include<bits/stdc++.h>
using namespace std;

int main(){
    int v1,v2,t,s,l;
    scanf("%d%d%d%d%d",&v1,&v2,&t,&s,&l);
    int l1=0,l2=0;//兔子,乌龟跑过的距离
    int flag=false;//兔子是否在休息
    int d;//兔子休息时长
    int cnt=0;//消耗时长
    while(true){
        cnt++;
        if(flag){
            d++;
            if(d==s)flag=false;
        }else l1+=v1;
        l2+=v2;
        //printf("%d %d %d %d\n",cnt,d,l1,l2);
        if(l1==l&&l1==l2){
            printf("D");
            break;
        }else if(l1==l){
            printf("R");
            break;
        }else if(l2==l){
            printf("T");
            break;
        }
        if(l1-l2>=t&&flag==false){
            flag=true;
            d=0;
        }
    }
    printf("\n%d",cnt);
    return 0;
}

时间转换

问题描述
  给定一个以秒为单位的时间t,要求用“::”的格式来表示这个时间。表示时间,表示分钟,而表示秒,它们都是整数且没有前导的“0”。例如,若t=0,则应输出是“0:0:0”;若t=3661,则输出“1:1:1”。
输入格式
  输入只有一行,是一个整数t(0<=t<=86399)。

#include<bits/stdc++.h>
using namespace std;

int main(){
    int n;
    cin>>n;
    printf("%d:%d:%d",n/3600,n%3600/60,n%60);
    return 0;
}

字符串对比

问题描述
  给定两个仅由大写字母或小写字母组成的字符串(长度介于1到10之间),它们之间的关系是以下4中情况之一:
  1:两个字符串长度不等。比如 Beijing 和 Hebei
  2:两个字符串不仅长度相等,而且相应位置上的字符完全一致(区分大小写),比如 Beijing 和 Beijing
  3:两个字符串长度相等,相应位置上的字符仅在不区分大小写的前提下才能达到完全一致(也就是说,它并不满足情况2)。比如 beijing 和 BEIjing
  4:两个字符串长度相等,但是即使是不区分大小写也不能使这两个字符串一致。比如 Beijing 和 Nanjing
  编程判断输入的两个字符串之间的关系属于这四类中的哪一类,给出所属的类的编号。
输入格式
  包括两行,每行都是一个字符串

#include<bits/stdc++.h>
using namespace std;

char toLower(char c){
    if(c<='Z')c+=32;
    return c;
}
int stringCmp(string &s1, string &s2){
    for(int i=0;i<s1.size();++i){
        if(toLower(s1[i])!=toLower(s2[i]))return 4;
    }
    return 3;
}

int main(){
    string s1,s2;
    cin>>s1>>s2;
    if(s1.size()!=s2.size())cout<<1;
    else{
        if(s1==s2)cout<<2;
        else cout<<stringCmp(s1,s2);
    }
    return 0;
}

FJ的字符串

问题描述
  FJ在沙盘上写了这样一些字符串:
  A1 = “A”
  A2 = “ABA”
  A3 = “ABACABA”
  A4 = “ABACABADABACABA”
  … …
  你能找出其中的规律并写所有的数列AN吗?
输入格式
  仅有一个数:N ≤ 26。

#include<bits/stdc++.h>
using namespace std;

int main(){
    string s = "A";
    int n;
    cin>>n;
    for(int i=1;i<n;++i){
        s = s + char('A'+i)+s;
    }
    cout<<s;
}

参考博客

蓝桥杯练习(一)

发布了277 篇原创文章 · 获赞 70 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_41146650/article/details/105148589