您现在的位置是:首页 > 学习之路 > ACM||算法ACM||算法

第四届蓝桥杯本科C++组

卞振伟2019-02-09【ACM||算法】人已围观

简介蓝桥杯
为促进软件和信息领域专业技术人才培养,提升高校毕业生的就业竞争力,由教育部就业指导中心支持,工业和信息化部人才交流中心举办。

第四届蓝桥杯本科C++组

 

题目文字解析在本页底部

A:

#include<bits/stdc++.h>

using namespace std;

int run(int year){
    if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))
        return 1;
    return 0;
}

int main(){
    int cont = 0;
    int data = 8113;
    for(int i = 1777; i <= 8113/365; ++i)
        if(run(i))
            cont++;
    cout<<1777+8113/365<<endl;
    cout<<8113%365-1<<endl;
}

得到年份后,具体月日手算获得,在这里手算比写代码会快很多。
 

B:

#include<bits/stdc++.h>

using namespace std;

int main(){
    int a[9] = {1,2,3,4,5,6,7,8,9};
    int ans = 0;
    do{
        if((a[0]*10+a[1])*(a[2]*100+a[3]*10+a[4])==(a[0]*100+a[3]*10+a[1])*(a[2]*10+a[4]))
            ans++;
    }while(next_permutation(a,a+9));
    cout<<ans/24;
}
 

C:

//51167078
//正着数
#include<cstdio>
int f(int n,int m)
{
    if(n<0)
        return 0;
    if(n==0&&m%2==0)
        return 1;
    return f(n-1,m+1)+f(n-2,m+1);
}
int main()
{
    printf("%d",f(39,0));
}

//倒着数
#include<bits/stdc++.h>
using namespace std;
int ans = 0;
void dfs(int step,int tap){
    if(step == 39 && tap == 0)
        ans++;
    if(step >= 39)
        return;
    dfs(step+1, (tap+1)%2 );
    dfs(step+2, (tap+1)%2 );
}

int main(){
    dfs(0,0);
    cout<<ans;
}
 

D:

#include <stdio.h>
#include <memory.h>

//大数乘10
void mul10(unsigned char* a) {
    short i = 0;
    for (; i < 99; i++) a[i] = a[i + 1];
    a[99] = 0;
}

//大数乘个位数i
void mul_i(unsigned char* a, unsigned char* dest, unsigned char i) {
    short v = 0;
    unsigned char all, num = 0, point;
    if (i == 0) {
        memset(dest, 0, 100);
        return;
    }
    for (v = 99; v >= 0; v--) {
        all = a[v] * i + num;
        num = all / 10;
        point = all - num * 10;
        dest[v] = point;
    }
}

//大数相减
void sub(unsigned char* a, unsigned char* b) {
    short i = 99;
    unsigned char flag = 0;
    for (; i >= 0; i--) {
        if (a[i] - flag < b[i]) {
            a[i] = a[i] + 10 - flag - b[i];
            flag = 1;
        }
        else {
            a[i] = a[i] - flag - b[i];
            flag = 0;
        }
    }
}

//大数相加
void add(unsigned char* a, unsigned char* b) {
    short i = 99, all;
    for (; i > 0; i--) {
        all = a[i] + b[i];
        if (all >= 10) {
            a[i - 1]++;
            a[i] = all - 10;
        }
        else
            a[i] = all;
    }
    a[0] = (a[0] + b[0]) % 10;
}

//大数相除第一个小数
unsigned char div_a_b(unsigned char* a, unsigned char* b) {
    unsigned char i = 1;
    unsigned char tmp[100];
    unsigned char tmp1[100] = { 0 };
    memcpy(tmp, a, 100);
    mul10(tmp);
    for (; i <= 10; i++) {
        mul_i(b, tmp1, i);
        if (memcmp(tmp1, tmp, 100) > 0) {
            mul10(a);
            memset(tmp1, 0, 100);
            mul_i(b, tmp1, i - 1);
            sub(a, tmp1);
            return i - 1;
        }
        memset(tmp1, 0, 100);
    }
}

//大数是否为零
bool isZero(unsigned char* a) {
    short i = 99;
    for (; i >=0; i--)
        if (a[i] != 0)
            return false;
    return true;
}

//保留100位小数相除
void div100(unsigned char* a, unsigned char* b, unsigned char* res) {
    unsigned char i = 0;
    unsigned char tmp[100];
    memcpy(tmp, a, 100);
    for (; i < 101; i++) {
        res[i] = div_a_b(tmp, b);
        if (isZero(tmp))
            return;
    }
}

int main()
{
    short index;
    //使用数组作为大数,res存放结果小数bufen
    unsigned char a[100] = { 0 };
    unsigned char b[100] = { 0 };
    unsigned char tmp[100] = { 0 };
    unsigned char pre[101] = { 0 };
    unsigned char res[101] = { 0 };

    a[99] = 1;
    b[99] = 2;
    do {
        memcpy(pre, res, 101);
        memset(res, 0, 101);
        div100(a, b, res);
        memcpy(tmp, a, 100);
        memcpy(a, b, 100);
        add(b, tmp);
    } while (memcmp(pre, res, 101));
    if (res[100] >= 5)
        res[99]++;
    index = 99;
    while (res[index--] == 10) {
        res[index + 1] = 0;
        res[index]++;
    }
    printf("0.");
    for (index = 0; index < 100; index++)
        printf("%d", res[index]);
    printf("\n");

    return 0;
}
 

E:

char* prefix(char* haystack_start, char* needle_start)
{
    char* haystack = haystack_start;
    char* needle = needle_start;
 
    
    while(*haystack && *needle){
        if(*(haystack++)!=*(needle++)) return NULL;  //填空位置
    }
    
    if(*needle) return NULL;
    
    return haystack_start;
}
 

F:

void sort3p(int* x, int len)
{
    int p = 0;
    int left = 0;
    int right = len-1;
    
    while(p<=right){
        if(x[p]<0){
            int t = x[left];
            x[left] = x[p];
            x[p] = t;
            left++;
            p++;
        }
        else if(x[p]>0){
            int t = x[right];
            x[right] = x[p];
            x[p] = t;
            right--;            
        }
        else{
            p++;  //填空位置
        }
    }
}
 

G:

//法一排序:
#include<bits/stdc++.h>
using namespace std;
int n,k,p,q,*a=new int[100];
int main()
{
    cin>>n;
    string s;
    cin.get();
    while(n--){
        getline(cin,s);
        stringstream ss(s);
        while(ss>>a[k++])   ;
        k--;
    }
    sort(a,a+k);
    for(int i=1;i<k;i++){
        if(!(a[i]-a[i-1]))
            q=a[i];
        if(a[i]-a[i-1]==2)
            p=a[i-1]+1;
    }
    delete []a;
    cout<<p<<' '<<q;
}

//法二不排序:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;
int n,k,p,q,*a=new int[maxn];
int main()
{
    cin>>n;
    string s;
    cin.get();
    int Min = maxn, Max = 0;
    while(n--){
        getline(cin,s);
        stringstream ss(s);
        while(ss >> k){
            Min = min(Min, k);
            Max = max(Max, k);
            if(a[k] == 1)
                q = k;
            a[k] = 1;
        }
    }
    for(int i = Min; i < Max; ++i)
        if (a[i] == 0)
            p = i;
    delete []a;
    cout<<p<<' '<<q;
}

 

H:

#include<iostream>
using namespace std;
int ans,k,a[1001];
int main(){
    string s,mo;
    cin>>s>>mo;
    for(int i=0;i<s.size();i++)
        if(s[i]!=mo[i])
            a[k++]=i;
    for(int i=0;i<k;i+=2)
        ans+=(a[i+1]-a[i]);
    cout<<ans;
}
 

I:

#include<bits/stdc++.h>
using namespace std;
int a[]={1,2,3,4,5,6,7,8,9},a1,a2,a3,ans;
#define _for(i,a,b) for(int i=(a);i<(b);i++)
int f(int n){
    do{
        _for(i,1,7)
        _for(j,2,9-i+1)
        _for(k,2,9-i-j+1)
            if(i+j+k==9){
                a1=a2=a3=0;
                _for(p,0,i) a1+=a[p],a1*=10;a1/=10;
                _for(p,i,9-k)   a2+=a[p],a2*=10;a2/=10;
                _for(p,j+1,9)   a3+=a[p],a3*=10;a3/=10;
                if(a2%10==a[j+1])   a2/=10;
                if((n-a1)*a3==a2)   ans++;
            }
    }while(next_permutation(a,a+9));
    return ans;
}
int main()
{
    int n;
    cin>>n;
    cout<<f(n);
}
 

J:

#include <iostream>
using namespace std;
int a[50000],ans;
int main()
{
    int n,i,j,Max,Min;
    cin>>n;
    for(i=0;i<n;i++)
        cin>>a[i];
    for(i=0;i<n;i++){
        Max=Min=a[i];
        for(j=i;j<n;j++){
            Max=max(a[j],Max);
            Min=min(a[j],Min);
            if(Max-Min==j-i)
                ans++;
        }
    }
    cout<<ans;
}

题目文字解析





 

Tags:编程   程序员   C|C++

很赞哦! ()

文章评论

站点信息

  • 建站时间:2018-11-25
  • 网站程序:帝国CMS7.5
  • 文章统计:118篇文章
  • 标签管理标签云
  • 统计数据百度统计
  • 网站地图XML网站地图
  • 微信公众号:扫描二维码,关注我的公众号
  • GitHub:扫描二维码,关注我的GitHub

客服在线

QQ客服

客服微信扫码

服务时间

周一至周日 9:00-21:00