【藍橋杯】“萌新首秀”全國高校新生程式設計排位賽3

山远尽成云發表於2024-10-09

一、下一次生日

題目

下一次生日

題目分析

閏年,四年一次,今年是閏年,那下一個閏年就是四年後

程式碼

#include 
using namespace std;
int main()
{
  cout<< "2028" ;
  return 0;
}

二、遺失的數字

題目

遺失的數字

題目分析

用一個陣列來記錄陣列A[N]出現的數字,如果出現過就記錄該陣列對應的數字為true,否則為flase

程式碼

#include 
#include 
#include 
using namespace std;
int main()
{
    int n;
    cin >> n;
    vector< int > a(n);
    vector< bool > p(n + 1,  false );
    for ( int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    for ( int i = 0; i < n; i++)
    {
        if (a[i] >= 1 && a[i] <= n) //判斷是否符合該範圍,可以省略
        {
            p[a[i]] =  true ;
        }
    }
    for ( int i = 1; i <= n; i++)
    {
        if (!p[i]) //遍歷,尋找沒有出現在陣列的最小整數
        {
            cout << i << endl;
            return 0;
        }
    }
    cout << n + 1;
    return 0;
}

三、超級手機號

題目

超級手機號

題目分析

1.把手機號當成字串輸入

2.判斷後面字元是否等於第一個字元,如果後面的字元全部等於第一個字元,返回true,否則,返回false

程式碼

#include 
using namespace std;

bool isz( string num)
{
    char base = num[0];
    for ( int i = 1; i < num.size(); i++)
    {
        if (num[i] !=  base )
        {
            return false ;
        }
    }
    return true ;
}

int main()
{
    int n, count = 0;
    cin >> n;
    for ( int i = 0; i < n; i++)
    {
        string num;
        cin >> num;
        if (isz(num))
        {
            count++;
        }
    }
    cout << count;
    return 0;
}

四、3枚硬幣

題目

3枚硬幣

題目分析

1.完成金額存放與去重處理

unordered_set<int> amounts;

2.分成三種情況計算金額,一枚金幣、兩枚金幣、三枚金幣......

程式碼

#include <iostream>  
#include <vector>  
#include <unordered_set>  
using namespace std;

int main() 
{
    int n;
    cin >> n;
    vector<int> coins(n);
    for (int i = 0; i < n; i++) 
    {
        cin >> coins[i];
    }

    unordered_set<int> amounts;
    // 使用一個迴圈來選擇硬幣的數量(0個、1個、2個或3個)  
    for (int numCoins = 0; numCoins <= 3; numCoins++) 
    {
        if (numCoins == 1) 
        {
            for (int coin : coins) //遍歷coins
            {
                amounts.insert(coin);
            }
        }
        else if (numCoins == 2) 
        {
            for (int i = 0; i < n; i++) 
            {
                for (int j = i + 1; j < n; j++) 
                {
                    amounts.insert(coins[i] + coins[j]);
                }
            }
        }
        else if (numCoins == 3) 
        {
            for (int i = 0; i < n; i++) 
            {
                for (int j = i + 1; j < n; j++) 
                {
                    for (int k = j + 1; k < n; k++) 
                    {
                        amounts.insert(coins[i] + coins[j] + coins[k]);
                    }
                }
            }
        }  
    }

    cout << amounts.size()+1 << endl;//加上金額為0的情況

    return 0;
}

五、運動飲料和礦泉水

題目

運動飲料和礦泉水

題目分析

一個腦筋急轉彎,各位可以去找規律,然後會發現:

1.奇數n時,先手最優只能拿到一瓶運動飲料,即第一杯,後面無論怎麼拿,都只能拿到水,對手則會拿到運動飲料

2.偶數n時,先手最優可以拿完所有飲料,而對手只能拿水

注意,這裡是雙方可以從任意一邊拿走飲料,而不是隻能選擇一邊

程式碼

#include <iostream>  
using namespace std;

int main() 
{
    int n;
    cin >> n;

    int maxcount = 0;//當前玩家能夠獲得的最多運動飲料數量

    if (n % 2 == 1)//奇數回合
    {
        maxcount = 1;
        cout << maxcount;
        return 0;
    }
    else
    {
        maxcount = n / 2;
        cout << maxcount;
        return 0;
    }

    return 0;
}

  

相關文章