计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力

Posted dyhaohaoxuexi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力相关的知识,希望对你有一定的参考价值。

这一部分内容比较简单 直接把代码发上来 不想自己写的同学可以直接抱走~


 

练习题:a+b 问题

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

int main()
{
    int n,x,y;
    cin>>n;
    while(n--)
    {
        cin>>x>>y;
        cout<<x+y<<endl;
    }
}

练习题:斐波那契数列

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

int main()
{
    int n;
    cin>>n;
    int a=1,b=1,c,i;
    if(n>2)
    {
        for(i=3;i<=n;i++)
        {
            c=(a+b)%1000000007 ;
            a=b;
            b=c;
        }
        cout<<c<<endl;
    }
    else
        cout<<1<<endl;
}

练习题:矩阵旋转

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

int main()
{
    int n,m,i,j,a[205][205];
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {
        cin>>a[i][j];
    }
    for(i=1;i<=m;i++)
    {
        cout<<a[n][i];
        for(j=n-1;j>=1;j--)
        {
            cout<< <<a[j][i];
        }
        cout<<endl;
    }
 } 

练习题:最大子阵

#include<bits/stdc++.h>
using namespace std;
int n,m,sums,anss,i,j,a[55][55],s[55][55],k;
int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++)
    for(j=1;j<=m;j++)
    {
        cin>>a[i][j];
        s[i][j]=s[i-1][j]+a[i][j];
    }
    anss=-0x7ffffff;
    for(i=1;i<=n;i++)
    for(j=i;j<=n;j++)
    {
        sums=0;
        for(k=1;k<=m;k++)
        {
            if(sums>=0)
            sums+=s[j][k]-s[i-1][k];
            else
            sums=s[j][k]-s[i-1][k];
            if(sums>anss)
            anss=sums;
        }
    }
    cout<<anss<<endl;
}

练习题:四平方和

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

int main()
{
    int n,a,b,c,d;
    cin>>n;
    for(a=0;a*a<n;a++)
    {
        for(b=a;b*b+a*a<n;b++)
        {
        for(c=b;c*c+b*b+a*a<n;c++)
        {
            if(sqrt(n-a*a-b*b-c*c)==(int)sqrt(n-a*a-b*b-c*c))
            {
                cout<<a<< <<b<< <<c<< <<(int)sqrt(n-a*a-b*b-c*c)<<endl;
                return 0;
            }
        }
        }
    }
}

练习题:A+B 问题

#include<bits/stdc++.h>

using namespace std;
int n,lena,lenb,ai,bi,jin,lenmax,p,q,i,t=0;
int anss[100000];
int main()
{
    memset(anss,0,sizeof(anss));
    jin=0;
    string a;
    string b;
    cin>>a;
    cin>>b;
    lena=a.size();
    lenb=b.size();
    lenmax=max(lena,lenb);
    p=lena-1;
    q=lenb-1;
    for(i=lenmax-1;i>=0;i--)
    {
        if(p<0)
        ai=0;
        else
        ai=a[p];
        if(q<0)
        bi=0;
        else
        bi=b[q];        
        anss[i]=(ai-0+bi-0+jin)%10;
        jin=(ai-0+bi-0+jin)/10;
        p--;
        q--;
    }
    if(jin)
    cout<<jin;
    for(i=0;i<lenmax;i++)
    cout<<anss[i];
    cout<<endl;
}

练习题:A*B 问题

#include<iostream>
#include<string>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
    string A,B;
    int ReverseA[1000+5];
    int ReverseB[1000+5];
    int a[1000+5];
    memset(a,0,sizeof(a));
    cin>>A>>B;
    int lenA = A.length();
    int lenB = B.length();
    // 得到逆转数组 
    for(int i=0;i<lenA;i++)
        ReverseA[i] = A[lenA-i-1]-0;
    for(int i=0;i<lenB;i++)
        ReverseB[i] = B[lenB-i-1]-0;
    // 计算 
    for(int i=0;i<lenA;i++)
        for(int j=0;j<lenB;j++){
            a[i+j] += ReverseA[i]*ReverseB[j];
            // 处理进位 
            if(a[i+j]>=10){
                a[i+j+1] += a[i+j]/10;
                a[i+j] %= 10;
            }
        }
    // 控制输出 
    bool flag = false;
    for(int i=lenA+lenB;i>=0;i--){
        if(a[i] && !flag || i==0)  // 答案为 0 的特殊情况 
            flag = true;
        else if(!a[i] && !flag)
            continue;    
        cout<<a[i];
    }
    return 0;
}

练习题:蒜头君的随机数

#include<bits/stdc++.h>

using namespace std;

set<int>a;

int main()
{
    int n,x;
    cin>>n;
    while(n--)
    {
        cin>>x;
        a.insert(x);
    }
    cout<<a.size()<<endl;
    set<int>::iterator it;
    bool flag=true;
    for(it=a.begin();it!=a.end();it++)  
    {
        if(flag)
        {
            cout<<*it;
            flag=!flag;
        }
        else
        cout<< <<*it;
    }


}

练习题:交叉排序

#include<bits/stdc++.h>

using namespace std;

bool cmp(int a,int b)
{
    return a>b;
}

int main()
{
    int n,i,l1,l2,r1,r2,a[100005];
    cin>>n>>l1>>r1>>l2>>r2;
    for(i=1;i<=n;i++)
    cin>>a[i];
    sort(a+l1,a+r1+1);
    sort(a+l2,a+r2+1,cmp);
    cout<<a[1];
    for(i=2;i<=n;i++)
    {
        cout<< <<a[i];
    }
}

练习题:进制转换

#include<bits/stdc++.h>

using namespace std;
stack<int>a;
int main()
{
    int x,n,r,flag=0;
    cin>>n>>r;
    if(n<0)
    {
        flag=1;
        n=abs(n);
    }
    while(n>0)
    {
        a.push(n%r);
        n=n/r;
    }
    if(a.empty())
    {
        cout<<0<<endl;
        return 0;
    }
    if(flag==1)
    cout<<-;
    while(!a.empty())
    {
        x=a.top();
        if(x>=10)
        cout<<char(x-10+A);
        else
        cout<<x;
        a.pop();
    }
}

练习题:回文数

#include<bits/stdc++.h>

using namespace std;

int sum=0;
queue <int> qq;
void panduan (int n)
{
    string s;
    int m=n;
    while(m)
    {
        s+=m%10+0;
        m=m/10;
    }
    string k=s;
    reverse(k.begin(),k.end());
    if(s==k)
    {
        //cout<<sum<<endl;
        //cout<<k<<endl;
        qq.push(n);
        return;
    }

    else
    {    //cout<<"s:"<<s<<‘ ‘<<"k:"<<k<<endl; 
        int l=0;
        for(int i=0;i<s.size();i++)
        {
            //cout<<pow(10,i)*(k[i]-‘0‘)<<endl;+
            l+=pow(10,i)*(k[i]-0);
        }
        //cout<<l<<endl;
        //cout<<n<<"--->";
        qq.push(n);
        sum++;
        panduan(l+n);
    }
}

int main()
{
    int n;
    cin>>n;
    panduan(n);
    cout<<sum<<endl;
    while(sum>=1)
    {
        cout<<qq.front()<<"--->";
        qq.pop();
        sum--;
    }
    cout<<qq.front()<<endl;
}

练习题:机器人

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

int x,y;

void go(int f,int l)
{
    if(f==1)
    {
        x+=l;
    }
    else if(f==2)
    {
        y+=l;
     } 
    else if(f==3)
    {
        x-=l;
    }
    else if(f==4)
    {
        y-=l;
    }
}


int main()
{
    int n,s;
    cin>>n;
    int f=1;
    string str;
    while(n--)
    {
        cin>>str>>s;
        if(str=="forward")
        {
            go(f,s);
            //cout<<x<<‘ ‘<<y<<‘ ‘<<f<<endl;
        }
        else if(str=="back")
        {
            if(f==1)
            go(f=3,s);
            else if(f==2)
            go(f=4,s);
            else if(f==3)
            go(f=1,s);
            else if(f==4)
            go(f=2,s);
            //cout<<x<<‘ ‘<<y<<‘ ‘<<f<<endl;
        }
        else if(str=="left")
        {
            if(f==1)
            go(f=2,s);
            else if(f==2)
            go(f=3,s);
            else if(f==3)
            go(f=4,s);
            else if(f==4)
            go(f=1,s);
            //cout<<x<<‘ ‘<<y<<‘ ‘<<f<<endl;
        }
        else if(str=="right")
        {
            if(f==1)
            go(f=4,s);
            else if(f==2)
            go(f=1,s);
            else if(f==3)
            go(f=2,s);
            else if(f==4)
            go(f=3,s);
            //cout<<x<<‘ ‘<<y<<‘ ‘<<f<<endl;
        }
    }
    cout<<x<< <<y<<endl;
}

练习题:表达式求值

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

int main()
{
    int x,temp,anss;
    char c;
    cin>>x;
    temp=x;
    anss=0;
    while(cin>>c>>x)
    {
        if(c==+)
        {
            anss+=temp%10000;
            anss=anss%10000;
            temp=x%10000;
        }
        else if(c==*)
        {
            temp*=x%10000;
            temp=temp%10000;
        }
        //cout<<anss<<endl;
    }
    anss+=temp%10000;
    cout<<anss%10000<<endl;
 } 

练习题:HZF 爱斗牛

#include<bits/stdc++.h>
using namespace std;
int i,sum,flag,a[20],s[20],j,x;
int main()
{
    for(i=1;i<=5;i++)
    {
        cin>>a[i];
        s[a[i]]++;
    }
    for(i=1;i<=13;i++)
    {
        if(s[i]>=4)
        {
            cout<<"quadra bomb orz"<<endl;
            return 0;
        }
    }
    sum=0;
    flag=0;
    for(i=1;i<=5;i++)
    {
        if(a[i]>=5)
        {
            flag=1;
            break;
        }
        sum+=a[i];
    }
    if(flag==0&&sum<=10)
    {
        cout<<"penta calf"<<endl;
        return 0;
    }
    sum=0;
    for(i=1;i<=5;i++)
    {
        if(a[i]>10)
        {
            a[i]=10;
        }
        sum+=a[i];
    }
    for(i=1;i<=4;i++)
    {
        for(j=i+1;j<=5;j++)
        {
            if((a[i]+a[j])%10==0&&((sum-a[i]-a[j])%10==0))
            {
                cout<<"you can you up"<<endl;
                return 0;
            }
        }
    }
    for(x=1;x<=9;x++)
    {
        for(i=1;i<=4;i++)
        {
            for(j=i+1;j<=5;j++)
            {
                if((a[i]+a[j])%10==x&&((sum-a[i]-a[j])%10==0))
                {
                    cout<<"too young too simple:calf "<<x<<endl;
                    return 0;
                }
            }
        }
     } 
     cout<<"gg"<<endl;
}

练习题:显示屏输出

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <set>
using namespace std;
char pic[10][5][2]=
{
    //  第1行  第2行   第3行  第4行   第5行(1,3,5行,也就是日字的三横只有一笔,所以pic[1~10][{1,3,5}][1]=‘ ‘)
    {{-, },{|,|},{ , },{|,|},{-, }},//数字0的第一行,第二行,第三行……
    {{ , },{ ,|},{ , },{ ,|},{ , }},//数字1的第一行,第二行,第三行……
    {{-, },{ ,|},{-, },{|, },{-, }},
    {{-, },{ ,|},{-, },{ ,|},{-, }},
    {{ , },{|,|},{-, },{ ,|},{ , }},
    {{-, },{|, },{-, },{ ,|},{-, }},
    {{-, },{|, },{-, },{|,|},{-, }},
    {{-, },{ ,|},{ , },{ ,|},{ , }},
    {{-, },{|,|},{-, },{|,|},{-, }},
    {{-, },{|,|},{-, },{ ,|},{-, }}
};
int main()
{
   int ex,cnt=0,num[10];
   char str[100];
   cin>>ex;
   cin>>str;
   for(int i=0;str[i]!=;i++)
     num[i]=str[i]-0;
    cnt = strlen(str);
    
   for(int row=1;row<=5;row++)//日字一共有5行
   {
       if(row%2==1)//日字的三横
       {
           for(int i=0;i<cnt;i++)//数字
           {
                cout<<" ";
                for(int j=0;j<ex;j++)//放大的倍数
                    cout<<pic[num[i]][row-1][0];
                cout<<" ";
                if(i!=cnt-1)
                    cout<<" ";
           }
           cout<<endl;
       }else{
            for(int i=0;i<ex;i++)//‘|‘放大的倍数
            {
                for(int j=0;j<cnt;j++)//数字
                {
                    char a,b;
                    a=pic[num[j]][row-1][0];
                    b=pic[num[j]][row-1][1];
                    cout<<a;
                    for(int k=0;k<ex;k++)
                        cout<<" ";
                    cout<<b;
                    if(j!=cnt-1)
                    cout<<" ";
                }
                cout<<endl;
            }
       }
   }
}

练习题:得到整数 X

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

int main()
{
    int x,n,i,j,a[30];
    cin>>n>>x;
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    int anss=0,sum=0;
    for(i=1;i<1<<n;i++)
    {
        sum=0;
        for(j=0;j<n;j++)
        {
            if(i&(1<<j))
            {
                sum+=a[j];
            }
        }
        if(sum==x)
        anss++;
    }
    cout<<anss<<endl;
}

练习题:幼儿园买玩具

#include<bits/stdc++.h>

using namespace std;
int n,m,k,sum,anss=0,a[105][20],flags[20],flag,i,j,p,u,s;
int main()
{
    cin>>n>>m>>k;
    for(i=1;i<=n;i++)
    {
        cin>>a[i][0];
        for(j=1;j<=a[i][0];j++)
        {
            cin>>a[i][j];
        }
    }
    for(i=1;i<1<<k;i++)
    {
        s=0;
        memset(flags,0,sizeof(flags));
        for(j=0;j<k;j++)
        {
            if(1<<j&i)
            {
                s++;
                flags[j]=1;
            }
        }
        if(s<=m)
        {
            sum=0;
            for(p=1;p<=n;p++)
            {
                flag=1;
                for(u=1;u<=a[p][0];u++)
                {
                    if(flags[a[p][u]-1]==0)
                    {
                        flag=0;
                        break;
                    }
                }
                if(flag)
                sum++;
            }
            if(sum>anss)
            anss=sum;
        }
    }
    cout<<anss<<endl;
}

练习题:islands 打炉石传说

#include<bits/stdc++.h>

using namespace std;

typedef struct 
{
    int cost;
    int d;
    int w;
}node;
node a[15];
int n,i,j,anss,sum,s,flag;
int main()
{
    cin>>n;
    for(i=0;i<n;i++)
    {
        cin>>a[i].cost>>a[i].d>>a[i].w;
    }
    anss=0;
    for(i=1;i<1<<n;i++)
    {
        sum=0;
        s=0;
        flag=0;
        for(j=0;j<n;j++)
        {
            if(1<<j&i)
            {
                if(a[j].d==0)
                    flag=1;
                sum+=a[j].w;
                s+=a[j].cost;
            }
        }
        if(s<=10&&sum>anss&&flag)
        anss=sum;
    }
    cout<<anss<<endl;
}

 

以上是关于计蒜客 《程序设计竞赛体验课程》第一部分 快速提升代码能力的主要内容,如果未能解决你的问题,请参考以下文章

计蒜客课程竞赛入门--堆排序 流程记

计蒜客课程竞赛入门--数塔问题(DP) 流程记

计蒜客课程竞赛入门--最长上升子序列(LIS) 流程记

计蒜客课程竞赛入门--蒜头学算数 流程记

计蒜客课程竞赛入门--冗余关系(并查集) 流程记

计蒜客课程竞赛入门--二叉搜索树 流程记