1. 程式人生 > 其它 >Contest2666 - 2021ACM俱樂部後備營個人訓練賽第9場

Contest2666 - 2021ACM俱樂部後備營個人訓練賽第9場

技術標籤:演算法acm競賽c++

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的陣列做的,不出意外執行錯誤了三次(線上自閉)。卡了幾乎半小時後換了思路。

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-YIV6wjHS-1610960310543)(C:\Users\happy\AppData\Roaming\Typora\typora-user-images\image-20210118163845338.png)]

邊讀邊處理資料,並定義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;
    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;
}

問題 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;
}