1. 程式人生 > 其它 >藍橋杯題集

藍橋杯題集

藍橋杯

題目連結

acwing藍橋杯

1.錯誤票據

難度:簡單
時/空限制:1s / 64MB
來源:第四屆藍橋杯省賽C++A/B組,第四屆藍橋杯省賽JAVAA/B組

題目描述

某涉密單位下發了某種票據,並要在年終全部收回。

每張票據有唯一的ID號。

全年所有票據的ID號是連續的,但ID的開始數碼是隨機選定的。

因為工作人員疏忽,在錄入ID號的時候發生了一處錯誤,造成了某個ID斷號,另外一個ID重號。

你的任務是通過程式設計,找出斷號的ID和重號的ID。

假設斷號不可能發生在最大和最小號。

輸入格式

第一行包含整數 \(N\),表示後面共有 \(N\) 行資料。

接下來 \(N\) 行,每行包含空格分開的若干個(不大於100個)正整數(不大於100000),每個整數代表一個ID號。

輸出格式

要求程式輸出1行,含兩個整數 \(m,n\),用空格分隔。

其中,\(m\)表示斷號ID,\(n\)表示重號ID。

資料範圍

\(1≤N≤100\)

輸入樣例:

2
5 6 8 11 9 
10 12 9

輸出樣例:

7 9

解題思路

模擬

資料較小,用陣列下標標記,模擬一遍即可~ 關鍵在於字串的處理~

  • 時間複雜度:\(O(n)\)
#include<cstdio>
#include<cstring>
#include<sstream>
#include<iostream>
#include<algorithm>
using namespace std;
int mn=0x3f3f3f3f,mx=0;
int v[100010],x;
int main()
{
    int n;
    memset(v,0,sizeof v);
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        string s;
        stringstream ss;
        getline(cin,s);
        ss.str(s);
        while(ss>>x)
        {
            v[x]++;
            mx=max(mx,x);
            mn=min(mn,x);   
        }
    }
    int r1,r2;
    for(int i=mn;i<=mx;i++)
        if(v[i]==0)r1=i;
        else if(v[i]==2)r2=i;
    printf("%d %d",r1,r2);
    return 0;
}

2.買不到的數目

難度:簡單
時/空限制:1s / 64MB
來源:第四屆藍橋杯省賽C++A組,第四屆藍橋杯省賽JAVAC組

題目描述

小明開了一家糖果店。

他別出心裁:把水果糖包成4顆一包和7顆一包的兩種。

糖果不能拆包賣。

小朋友來買糖的時候,他就用這兩種包裝來組合。

當然有些糖果數目是無法組合出來的,比如要買 10 顆糖。

你可以用計算機測試一下,在這種包裝情況下,最大不能買到的數量是17。

大於17的任何數字都可以用4和7組合出來。

本題的要求就是在已知兩個包裝的數量時,求最大不能組合出的數字。

輸入格式

兩個正整數 \(n,m\),表示每種包裝中糖的顆數。

輸出格式

一個正整數,表示最大不能買到的糖數。

資料範圍

\(2≤n,m≤1000\)
保證資料一定有解。

輸入樣例:

4 7

輸出樣例:

17

解題思路

如果 \(a,b\) 均是正整數且互質,那麼由 \(ax+by,x≥0,y≥0\) 不能湊出的最大數是 \(ab−a−b\)

  • 時間複雜度:\(O(1)\)

程式碼

#include<cstdio>
using namespace std;
int n,m;
int main()
{
    scanf("%d %d",&n,&m);
    printf("%d",n*m-n-m);
    return 0;
}

3.剪格子

難度:困難
時/空限制:1s / 64MB
來源:第四屆藍橋杯省賽C++A/C組,第四屆藍橋杯省賽JAVAA/C組

題目描述

如下圖所示,\(3×3\) 的格子中填寫了一些整數。

我們沿著圖中的紅色線剪開,得到兩個部分,每個部分的數字和都是 60。

本題的要求就是請你程式設計判定:對給定的 \(m×n\) 的格子中的整數,是否可以分割為兩個連通的部分,使得這兩個區域的數字和相等。

如果存在多種解答,請輸出包含左上角格子的那個區域包含的格子的最小數目。

如果無法分割,則輸出 0。

輸入格式

第一行包含兩個整數 \(m,n\) ,表示表格的寬度和高度。

接下來是 \(n\) 行,每行 \(m\) 個正整數,用空格分開。

輸出格式

在所有解中,包含左上角的分割區可能包含的最小的格子數目。

如果無法分割,則輸出 \(0\)

資料範圍

\(1≤n,m<10\),
格子內的數均在1到10000之間。

輸入樣例1:

3 3
10 1 52
20 30 1
1 2 3

輸出樣例1:

3

輸入樣例2:

4 3
1 1 1 1
1 30 80 2
1 1 1 100

輸出樣例2:

10

解題思路

dfs,剪枝,字串hash,並查集

  • 時間複雜度:\(()\)

程式碼