Contest2666 - 2021ACM俱乐部后备营个人训练赛第9场

Contest2666 - 2021ACM俱乐部后备营个人训练赛第9场

问题 A: 6174问题

思路

四位数拆分,开两个数组a,b,用来存拆分出来的个、十、百、千位上的数,然后,sort快排(从小到大),再自个写个cmp(从大到小),定义maxx,minx,分别存最大的数和最小的数,与前一个数进行比较,相等则输出,不想等,则继续。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
bool cmp(int a,int b)
{
    
    
    return a>b;
}
 
void func(int m,int a[],int b[])
{
    
    
    int count=0,maxx=-1,minx=0;
    while(1)
        {
    
    
            sort(a,a+4,cmp);
            sort(b,b+4);
            maxx=a[0]*1000+a[1]*100+a[2]*10+a[3];
            minx=b[0]*1000+b[1]*100+b[2]*10+b[3];
            ++count;
            if(m==(maxx-minx))
            {
    
    
                cout<<count<<"\n";
                break;
            }
            else
            {
    
    
                m=maxx-minx;
                a[0]=m/1000;
                a[1]=(m%1000)/100;
                a[2]=(m%100)/10;
                a[3]=m%10;
                b[0]=a[0];
                b[1]=a[1];
                b[2]=a[2];
                b[3]=a[3];
            }
        }
}
 
int main()
{
    
    
    int n,m,a[4],b[4];
    cin>>n;
    while(n--)
    {
    
    
        cin>>m;
        a[0]=m/1000;
        a[1]=(m%1000)/100;
        a[2]=(m%100)/10;
        a[3]=m%10;
        b[0]=a[0];
        b[1]=a[1];
        b[2]=a[2];
        b[3]=a[3];
        func(m,a,b);
    }
    return 0;
}

问题 B: 卖股票

思路

千万别开数组,我一开始开了两个1000005的数组做的,不出意外运行错误了三次(在线自闭)。卡了几乎半小时后换了思路。
在这里插入图片描述

边读边处理数据,并定义differ来存储最大的差值,即笨笨的每股股票最多能赚的钱,同时比较读入的数与上一个数的大小

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int n,minprice,price;
    int differ=0;
    cin>>n;
    cin>>minprice;
    while(--n)
    {
    
    
        cin>>price;
        if(differ<price-minprice)
            differ=price-minprice;
        if(minprice>price)
            minprice=price;
    }
    cout<<differ;
    return 0;
}

问题 E: 统计字数

思路

有手就行。读入一行字符,所以用了getline(cin,s);

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    string s;
    int e=0,n=0;
    getline(cin,s);
    for(int i=0;i<s.size();++i){
    
    
        if(s[i]>='a'&&s[i]<='z' || s[i]>='A'&&s[i]<='Z')
            ++e;
        if(s[i]>='0'&&s[i]<='9')
            ++n;
    }
    cout<<e<<" "<<n;
    return 0;
}

问题 F: 整数拆分

思路

取子串,有点类似第八场的E题,但是主要特判首位置为 0 的情况。其他基本就是string类函数的调用,不会的去学c++——string类基础详解

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    string s,a,temp;
    cin>>s>>a;
    int count=0;
    for(int i=0;i<s.size();i++)
    {
    
    
        for(int j=1;j<=s.size()-i;j++)
        {
    
    
            if(s[i]!='0')
            {
    
    
                temp=s.substr(i,j);
                if(temp.size()>a.size())
                    ++count;
                if(temp.size()==a.size() && temp.compare(a)>0)
                    ++count;
            }
        }
    }
    cout<<count;
    return 0;
}

问题 I: 数列计算VI

思路

开一个数组,每一个数都是它前面相邻四个数字之和的个位数字.

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int n;
    cin>>n;
    int ans=0,a[20];
    a[0]=1;
    a[1]=9;
    a[2]=8;
    a[3]=7;
    for(int i=4;i<n;++i)
        a[i]=(a[i-1]+a[i-2]+a[i-3]+a[i-4])%10;
    for(int i=0;i<n;++i)
    {
    
    
        cout<<a[i]<<" ";
        ans += a[i];
    }
    cout<<endl<<ans;
    return 0;
}

问题 J: 海淀排序

思路

开数组,写个cmp(从大到小)sort快排,比较,输出下标。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
bool cmp(int a,int b)
{
    
    
    return a>b;
}
 
int main()
{
    
    
    int n,m;
    cin>>n;
    int a[16];
    for(int i=1;i<=n;++i)
        cin>>a[i];
    sort(a+1,a+n+1,cmp);
    cin>>m;
    for(int i=1;i<=n;++i)
        if(m>=a[i])
        {
    
    
            cout<<i;
            break;
        }
    return 0;
}

问题 K: 猜数

思路

三位数拆分,遍历。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int n,i;
    cin>>n;
    int ans,a=0,b=0,c=0;;
    int ge,shi,bai;
    for(int i=1;i<=n;++i)
    {
    
    
        ge=i%10;
        shi=(i%100)/10;
        bai=i/100;
        if(ge==2)
            ++a;
        if(shi==2)
            ++b;
        if(bai==2)
            ++c;
    }
    ans = a+b+c;
    cout<<ans;
    return 0;
}

问题 L: Haiku

思路

有手就行,这篇可能是考英文(英文题目,呜呜呜)。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    string s;
    cin>>s;
    for(int i=0;i<s.size();++i)
        if(s[i]==',')
            s[i]=' ';
    cout<<s;
    return 0;
}

问题 M: Sum of Three Integers

思路

同样也是英文题目,有点像c语言课后题,最直接的三个for循环,暴力解,但是在这里会时间超限(别问我为啥知道,问就是我已干过了),所以我们需要优化掉最后一层循环。

代码

#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    
    
    int k,s;
    int i,j,l;
    cin>>k>>s;
    long long count=0;
    for(i=0;i<=k;++i)
        for(j=0;j<=k;++j)
                if(s-i-j>=0&&s-i-j<=k)
                    ++count;
    cout<<count;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/m0_51344172/article/details/112788797