第九屆藍橋杯大賽個人賽省賽(軟件類)C/C++ 大學B組比賽心得(還在更新)

第九屆藍橋杯大賽個人賽省賽(軟件類)C/C++ 大學B組

考生須知:

  1. 考試開始后,選手首先下載題目,并使用考場現場公布的解壓密碼解壓試題。

  2. 考試時間為4小時。時間截止后,提交答案無效。

  3. 在考試強制結束前,選手可以主動結束考試(需要身份驗證),結束考試后將無法繼續提交或瀏覽答案。

  4. 選手可瀏覽自己已經提交的答案。被瀏覽的答案允許拷貝。

  5. 對同一題目,選手可多次提交答案,以最后一次提交的答案為準。

  6. 選手切勿在提交的代碼中書寫“姓名”、“考號”,“院校名”等與身份有關的信息或其它與競賽題目無關的內容,否則成績無效。

  7. 選手必須通過瀏覽器方式提交自己的答案。選手在其它位置的作答或其它方式提交的答案無效。

  8. 試題包含三種類型:“結果填空”、“代碼填空”與“程序設計”。

    1. 結果填空題:要求選手根據題目描述直接填寫結果。求解方式不限。不要求源代碼。把結果填空的答案直接通過網頁提交即可,不要書寫多余的內容。

    2. 代碼填空題:要求選手在弄清給定代碼工作原理的基礎上填寫缺失的部分,使得程序邏輯正確、完整。把代碼填空的答案(僅填空處的答案,不包括題面已存在的代碼或符號)直接通過網頁提交即可,不要書寫多余的內容。使用ANSI C/ANSI C++ 標準,不要依賴操作系統或編譯器提供的特殊函數。

    3. 程序設計題目:要求選手設計的程序對于給定的輸入能給出正確的輸出結果。考生的程序只有能運行出正確結果才有機會得分。

      注意:在評卷時使用的輸入數據與試卷中給出的示例數據可能是不同的。選手的程序必須是通用的,不能只對試卷中給定的數據有效。對于編程題目,要求選手給出的解答完全符合ANSI C++標準,不能使用諸如繪圖、Win32API、中斷調用、硬件操作或與操作系統相關的API。代碼中允許使用STL類庫。注意: main函數結束必須返回0注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。所有源碼必須在同一文件中。調試通過后,拷貝提交。提交時,注意選擇所期望的編譯器類型。

題目們(づ ̄ 3 ̄)づ:

1. 第幾天(結果填空)(滿分5分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,不限解決問題的方式,只要求提交結果。必須通過瀏覽器提交答案。

題目描述:

2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第幾天?注意:需要提交的是一個整數,不要填寫任何多余內容。

解題思路:

這個題用EXCEL解決豈不是妙哉(●'?'●),所以,貼圖好了= ̄ω ̄=。

2.明碼(結果填空) (滿分7分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,不限解決問題的方式,只要求提交結果。必須通過瀏覽器提交答案。

題目描述:

漢字的字形存在于字庫中,即便在今天,16點陣的字庫也仍然使用廣泛。
16點陣的字庫把每個漢字看成是16x16個像素信息。并把這些信息記錄在字節中。

一個字節可以存儲8位信息,用32個字節就可以存一個漢字的字形了。
把每個字節轉為2進制表示,1表示墨跡,0表示底色。每行2個字節,
一共16行,布局是:

第1字節,第2字節
第3字節,第4字節
....
第31字節, 第32字節

這道題目是給你一段多個漢字組成的信息,每個漢字用32個字節表示,這里給出了字節作為有符號整數的值。

題目的要求隱藏在這些信息中。你的任務是復原這些漢字的字形,從中看出題目的要求,并根據要求填寫答案。

這段信息是(一共10個漢字):

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 

16 64 16 64 34 68 127 126 66 -124 67 4 66 4 66 -124 126 100 66 36 66 4 66 4 66 4 126 4 66 40 0 16 

4 0 4 0 4 0 4 32 -1 -16 4 32 4 32 4 32 4 32 4 32 8 32 8 32 16 34 16 34 32 30 -64 0 

0 -128 64 -128 48 -128 17 8 1 -4 2 8 8 80 16 64 32 64 -32 64 32 -96 32 -96 33 16 34 8 36 14 40 4 

4 0 3 0 1 0 0 4 -1 -2 4 0 4 16 7 -8 4 16 4 16 4 16 8 16 8 16 16 16 32 -96 64 64 

16 64 20 72 62 -4 73 32 5 16 1 0 63 -8 1 0 -1 -2 0 64 0 80 63 -8 8 64 4 64 1 64 0 -128 

0 16 63 -8 1 0 1 0 1 0 1 4 -1 -2 1 0 1 0 1 0 1 0 1 0 1 0 1 0 5 0 2 0 

2 0 2 0 7 -16 8 32 24 64 37 -128 2 -128 12 -128 113 -4 2 8 12 16 18 32 33 -64 1 0 14 0 112 0 

1 0 1 0 1 0 9 32 9 16 17 12 17 4 33 16 65 16 1 32 1 64 0 -128 1 0 2 0 12 0 112 0 

0 0 0 0 7 -16 24 24 48 12 56 12 0 56 0 -32 0 -64 0 -128 0 0 0 0 1 -128 3 -64 1 -128 0 0 

注意:需要提交的是一個整數,不要填寫任何多余內容。

解題思路:

這個題好多人做的很懵的樣子欸(⊙?⊙),或許是我同時打CTF的原因,所以我趕腳還好啊(????)。標準的隱寫術啊(╯‵□′)╯︵┻━┻。

**坑點:1.九的九次方不是81啊喂(#`O′)。2.沒讓填十個漢字不是嗎?都說了需要提交的是一個整數<@_@>

貼代碼:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n=32;
    bool huanhang=true;
    while(n--)
    {
        int num,i;
        bool flag=false;
        int str[8]={0,0,0,0,0,0,0,0};
        cin>>num;
        if(num<0) {num=-1-num;flag = !flag;}
        for(i=0;num != 0 && num != 1;i++)
        {
            str[i] = num % 2;
            num = num / 2;
        }
        str[i] = num;
        if(flag)
        {
            for(int i=0;i<8;i++)
                if(str[i]==0) str[i]=1;
                else str[i]=0;
        }
        for(int j=7;j>=0;j--)
        {
            //if(str[j]==0) cout<<" ";
            //else cout<<str[j];
            cout<<str[j];
        }
        if(huanhang) cout<<" ";
        else cout<<endl;
        huanhang = !huanhang;
    }
    return 0;
}

3. 乘積尾零(結果填空) (滿分13分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,不限解決問題的方式,只要求提交結果。必須通過瀏覽器提交答案。

題目描述:

如下的10行數據,每行有10個整數,請你求出它們的乘積的末尾有多少個零?

5650 4542 3554 473 946 4114 3871 9073 90 4329 

2758 7949 6113 5659 5245 7432 3051 4434 6704 3594 

9937 1173 6866 3397 4759 7557 3070 2287 1453 9899 

1486 5722 3135 1170 4014 5510 5120 729 2880 9019 

2049 698 4582 4346 4427 646 9742 7340 1230 7683 

5693 7015 6887 7381 4172 4341 2909 2027 7355 5649 

6701 6645 1671 5978 2704 9926 295 3125 3878 6785 

2066 4247 4800 1578 6652 4616 1113 6205 3264 2915 

3966 5291 2904 1285 2193 1428 2265 8730 9436 7074 

689 5510 8243 6114 337 4096 8199 7313 3685 211 

注意:需要提交的是一個整數,表示末尾零的個數。不要填寫任何多余內容。

解題思路:

這個題當時一看就要用大數運算,在加上突然發現機子上是全環境于是。。。我默默打開了Eclipse,我一看。。全英文界面Σ(っ °Д °;)っ(我英文不好被關了起來~>_<~)于是憑記憶把自動補全打開。接著調用BigInteger類

報錯報出天際。。。つ﹏?,我默默關了Eclipse就放棄了這個題。。。老闊疼。。。

比賽結束之后,俊杰小哥哥(我是不會告訴你們俊杰小哥哥是誰的O(∩_∩)O)告訴我可以用快速冪,汪醬(我也是不會告訴你們汪醬是誰的O(∩_∩)O)告訴我了一種很神奇的解法。

就是,要求末尾0的個數就相當于一個數為一個整數乘以10的n次冪(那個數由100個數相乘而來),求n的最大值,那么,問題就可以轉化為,求每個數的2*5存在的個數,累乘即可。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int num[100],sum_2=0,sum_5=0;
    for(int i=0;i<100;i++)
    {   
        cin>>num[i];
        while(num[i] % 2 == 0)
        {
            sum_2++;
            num[i] /= 2;
        }
        while(num[i] % 5 == 0)
        {
            sum_5++;
            num[i] /= 5;
        }
    } 
    cout<<min(sum_2,sum_5);
    return 0;
}

4. 摔手機(誤)測試次數(結果填空) (滿分17分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,不限解決問題的方式,只要求提交結果。必須通過瀏覽器提交答案。

題目描述:

x星球的居民脾氣不太好,但好在他們生氣的時候唯一的異常舉動是:摔手機。
各大廠商也就紛紛推出各種耐摔型手機。x星球的質監局規定了手機必須經過耐摔測試,并且評定出一個耐摔指數來,之后才允許上市流通。

x星球有很多高聳入云的高塔,剛好可以用來做耐摔測試。塔的每一層高度都是一樣的,與地球上稍有不同的是,他們的第一層不是地面,而是相當于我們的2樓。

如果手機從第7層扔下去沒摔壞,但第8層摔壞了,則手機耐摔指數=7。
特別地,如果手機從第1層扔下去就壞了,則耐摔指數=0。
如果到了塔的最高層第n層扔沒摔壞,則耐摔指數=n

為了減少測試次數,從每個廠家抽樣3部手機參加測試。

某次測試的塔高為1000層,如果我們總是采用最佳策略,在最壞的運氣下最多需要測試多少次才能確定手機的耐摔指數呢?

請填寫這個最多測試次數。

注意:需要填寫的是一個整數,不要填寫任何多余內容。

解題思路:

這個題。。。。emmmmm我先發張圖大家自行體會下。。。

這個題真的是充滿了怨念。。。。。(╯‵□′)╯︵┻━┻

算法競賽入門經典這本書上有原題在P292的例題 9-20。。。。。。

5.快速排序(代碼填空) (滿分9分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,不限解決問題的方式。只要求填寫缺失的代碼部分,千萬不要畫蛇添足,填寫多余的已有代碼或符號。必須通過瀏覽器提交答案。

題目描述:

以下代碼可以從數組a[]中找出第k小的元素。

它使用了類似快速排序中的分治算法,期望時間復雜度是O(N)的。

請仔細閱讀分析源碼,填寫劃線部分缺失的內容。

#include <stdio.h>

int quick_select(int a[], int l, int r, int k) {
    int p = rand() % (r - l + 1) + l;
    int x = a[p];
    {int t = a[p]; a[p] = a[r]; a[r] = t;}
    int i = l, j = r;
    while(i < j) {
        while(i < j && a[i] < x) i++;
        if(i < j) {
            a[j] = a[i];
            j--;
        }
        while(i < j && a[j] > x) j--;
        if(i < j) {
            a[i] = a[j];
            i++;
        }
    }
    a[i] = x;
    p = i;
    if(i - l + 1 == k) return a[i];
    if(i - l + 1 < k) return quick_select( _____________________________ ); //填空
    else return quick_select(a, l, i - 1, k);
}
    
int main()
{
    int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
    printf("%d\n", quick_select(a, 0, 14, 5));
    return 0;
}

注意:只填寫劃線部分缺少的代碼,不要抄寫已經存在的代碼或符號。

解題思路:

這個題。。。我比賽的時候。。我想當然的填了a, l, i + 1, k,后來發現是錯的。。。

/(ㄒoㄒ)/~~

正確答案應該是這個a, i+1, r, k-(i-l+1)。。。。

#include <stdio.h>
int quick_select(int a[], int l, int r, int k) {
    int p = rand() % (r - l + 1) + l;//隨機定位一個基準下標 
    int x = a[p];//將基準下標代表的數字取出 
    /*這里由于已經把基準值存入了x中,所以可以認為a[p]是挖了一個坑,可以填數據*/
    {int t = a[p]; a[p] = a[r]; a[r] = t;}//將挖的坑移至數組尾端 
    int i = l, j = r;//i作為從前向后檢索的下表,j作為從后向前檢索的下標 
    while(i < j) {//快速排序
        while(i < j && a[i] < x) i++;//如果有值比基準值小且在基準值左方那么不變
        if(i < j) {//如果有值比基準值大且在基準值左方
            a[j] = a[i];//用這個值把坑填上
            j--;//j下標向前移動
        }//此時i指向了那個坑
        while(i < j && a[j] > x) j--;//如果有值比基準值大且在基準值右方那么不變
        if(i < j) {//如果有值比基準值小且在基準值右方
            a[i] = a[j];//再次把坑填上
            i++;//i下標向后移動
        }
    }
    a[i] = x;//把x的值扔回去,此時,比x小的值都在其左側,比x大的值都在其右側。
    p = i;//此時x是第幾個數,就是第幾小的數。
    if(i - l + 1 == k) return a[i];
    if(i - l + 1 < k) return quick_select( a, i+1, r, k-(i-l+1) ); //填空
    else return quick_select(a, l, i - 1, k);
}
    
int main()
{
    int a[] = {1, 4, 2, 8, 5, 7, 23, 58, 16, 27, 55, 13, 26, 24, 12};
    printf("%d\n", quick_select(a, 0, 14, 5));
    return 0;
}


6.遞增三元組(程序設計)(滿分11分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,必須通過編程的方式解決問題。注意:在評卷時使用的輸入數據與試卷中給出的示例數據可能是不同的。選手的程序必須是通用的,不能只對試卷中給定的數據有效。仔細閱讀程序的輸入、輸出要求,千萬不要輸出沒有要求的、多余的內容,例如:“請您輸入xx數據:”。建議仔細閱讀示例,不要想當然!程序處理完一個用例的數據后,立即退出(return 0),千萬不要循環等待下一個用例的輸入。程序必須使用標準輸入、標準輸出,以便于機器評卷時重定向。對于編程題目,要求選手給出的解答完全符合ANSI C++標準,不能使用諸如繪圖、Win32API、中斷調用、硬件操作或與操作系統相關的API。代碼中允許使用STL類庫。注意: main函數結尾需要return 0。注意: 所有依賴的函數必須明確地在源文件中 #include <xxx>, 不能通過工程設置而省略常用頭文件。所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。提交時,注意選擇所期望的編譯器類型。

題目描述:

   給定三個整數數組

   A = [A1, A2, ... AN], 
   B = [B1, B2, ... BN], 
   C = [C1, C2, ... CN],
   請你統計有多少個三元組(i, j, k) 滿足:

   1. 1 <= i, j, k <= N  
   2. Ai < Bj < Ck  

?

【輸入格式】 
第一行包含一個整數N。
第二行包含N個整數A1, A2, ... AN。
第三行包含N個整數B1, B2, ... BN。
第四行包含N個整數C1, C2, ... CN。

對于30%的數據,1 <= N <= 100  
對于60%的數據,1 <= N <= 1000 
對于100%的數據,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000 
【輸出格式】
一個整數表示答案
【樣例輸入】
3
1 1 1
2 2 2
3 3 3
【樣例輸出】
27 
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴于編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include \<xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

解題思路:

考試的時候我直接就用的暴力解法了。<( ̄ˇ ̄)/。。非暴力不會啊。。/(ㄒoㄒ)/~~。。:-(

//暴力解法
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N,sum=0;
    cin>>N;
    int *A = new int[N];
    int *B = new int[N];
    int *C = new int[N];
    for(int i=0;i<N;i++)
        cin>>A[i];
    for(int i=0;i<N;i++)
        cin>>B[i];
    for(int i=0;i<N;i++)
        cin>>C[i];
    for(int i=0;i<N;i++)
        for(int j=0;j<N;j++)
            for(int q=0;q<N;q++)
                if(A[i]<B[j]&&B[j]<C[q]&&A[i]<C[q])
                    sum++;
    cout<<sum;
    return 0;
}
//非暴力解法請等待更新(*/ω\*)

7.螺旋折線(程序設計)(滿分19分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,必須通過編程的方式解決問題。注意事項同上題

題目描述:

如圖p1.png所示的螺旋折線經過平面上所有整點恰好一次。
對于整點(X, Y),我們定義它到原點的距離dis(X, Y)是從原點到(X, Y)的螺旋折線段的長度。

例如dis(0, 1)=3, dis(-2, -1)=9

給出整點坐標(X, Y),你能計算出dis(X, Y)嗎?

p1.png
【輸入格式】
X和Y  

對于40%的數據,-1000 <= X, Y <= 1000  
對于70%的數據,-100000 <= X, Y <= 100000  
對于100%的數據, -1000000000 <= X, Y <= 1000000000  
【輸出格式】
輸出dis(X, Y)  
【樣例輸入】
0 1
【樣例輸出】
3
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴于編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

解題思路:

這個我直接考慮的是點的轉移。= ̄ω ̄=

例如:

如果一個點在第一象限(x,y),那么接下來它必然會轉移到第二象限(-x,y)

如果一個點在第二象限(x,y),那么接下來它必然會轉移到第三象限(x,-y+1)

特別的,如果該點在(-1,1),那么接下來它會轉移到x軸上(-1,0)

如果一個點在第三象限(x,y),那么接下來它必然會轉移到第四象限(-x-1,y)

如果一個點在第四象限(x,y),那么接下來它必然會轉移到第一象限(x,-y)

如果一個點在x軸正半軸(x,0),那么接下來它必然會轉移到第一象限(x,x)

如果一個點在y軸正半軸(0,y),那么接下來它必然會轉移到第二象限(y,y)

如果一個點在x軸負半軸(x,0),那么接下來它必然會轉移到第三象限(x,x+1)

特別的,如果該點在(-1,0),那么接下來它會轉移到原點(0,0)

如果一個點在y軸負半軸(0,y),那么接下來它必然會轉移到第四象限(-y,y)

接下來我貼一下代碼(づ??????)づ

//暴力解法
#include<bits/stdc++.h>
using namespace std;
int dist=0;
int dis(int x,int y)
{
    if(x==0&&y==0) return 0;
    else if(x==-1&&y==0) 
    {
        dist=dist+1;
        x=x+1;
    }
    else if(x>0&&y>0)
    {
        dist=dist+2*x;
        x=-x;
    }
    else if(x<0&&y>0)
    {
        dist=dist+2*y-1;
        y=-y+1;
    }
    else if(x<0&&y<0)
    {
        dist=dist-2*x-1;
        x=-x-1;
    }
    else if(x>0&&y<0)
    {
        dist=dist-2*y;
        y=-y;
    }
    else if(x==0&&y>0)
    {
        dist=dist+y;
        x=-y;
    } 
    else if(x<0&&y==0)
    {
        dist=dist-x-1;
        y=x+1;
    }
    else if(x==0&&y<0)
    {
        dist=dist-y;
        x=-y;
    }
    else if(x>0&&y==0)
    {
        dist=dist+x;
        y=x;
    }
    //cout<<x<<" "<<y<<endl;
    //cout<<dist<<endl;
    dis(x,y);
}
int main()
{
    int x,y;
    cin>>x>>y;
    dis(x,y);
    cout<<dist;
}
//非暴力解法請等待更新(*/ω\*)

8. 日志統計(程序設計)(滿分21分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,必須通過編程的方式解決問題。注意事項同上題

題目描述:

小明維護著一個程序員論壇。現在他收集了一份"點贊"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts時刻編號id的帖子收到一個"贊"。

現在小明想統計有哪些帖子曾經是"熱帖"。如果一個帖子曾在任意一個長度為D的時間段內收到不少于K個贊,小明就認為這個帖子曾是"熱帖"。

具體來說,如果存在某個時刻T滿足該帖在[T, T+D)這段時間內(注意是左閉右開區間)收到不少于K個贊,該帖就曾是"熱帖"。

給定日志,請你幫助小明統計出所有曾是"熱帖"的帖子編號。

【輸入格式】
第一行包含三個整數N、D和K。  
以下N行每行一條日志,包含兩個整數ts和id。  

對于50%的數據,1 <= K <= N <= 1000  
對于100%的數據,1 <= K <= N <= 100000 0 <= ts <= 100000 0 <= id <= 100000  
【輸出格式】
按從小到大的順序輸出熱帖id。每個id一行。  
【輸入樣例】
7 10 2  
0 1  
0 10    
10 10  
10 1  
9 1
100 3  
100 3 
【輸出樣例】
1  
3  
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴于編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

解題思路:

我下面給出的思路其實和我比賽時使用的思路有些出入,比賽時我的思路是,由于他要求的是某一時間段,那么利用二重循環,將那一個時間段的起始時間逐漸后移,每次后移利用循環遍歷時間段內的id的獲贊數,若獲贊數大于k,則輸出。這樣后來發現會有重復輸出的問題,于是又加入了flag作為標志,若已輸出過則不再輸出。思路上是將id與ts擬合成了一條有許多端點的線段,之后用時間圍成的框框去逐漸后移。(**)

這里呢,我的思路是先將id相同的進行歸類,之后求出相同id的ts的最大值與次大值,做差若小于D且獲贊數大于等于K,即輸出id。o(* ̄▽ ̄*)ブ

//暴力解法
#include<bits/stdc++.h>
using namespace std;
int main()
{
    int N,D,K;
    cin>>N>>D>>K;
    int *id = new int[N];
    int *ts = new int[N];
    for(int i=0;i<N;i++)
        cin>>ts[i]>>id[i];
    for(int i=0;i<N;i++)
        for(int j=i;j<N-1-i;j++)
            if(id[j]>id[j+1])
            {
                int temp_1,temp_2;
                temp_1=id[j];
                id[j]=id[j+1];
                id[j+1]=temp_1;
                temp_2=ts[j];
                ts[j]=ts[j+1];
                ts[j+1]=temp_2; 
            }
    for(int i=0;i<N;)
    {
        int max=ts[i],next_max=ts[i],j,zan=0;
        for(j=i;id[i]==id[j];j++)
            {if(ts[j]>max) max=ts[j];zan++;}
        for(j=i;id[i]==id[j];j++)
            if(ts[j]>next_max&&ts[j]<max) next_max=ts[j];
        if((max-next_max)<D && zan>=K) cout<<id[i]<<endl;
        i=j;
    }
}
//非暴力解法請等待更新(*/ω\*)

9.全球變暖(程序設計)(滿分23分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,必須通過編程的方式解決問題。注意事項同上題

題目描述:

你有一張某海域NxN像素的照片,"."表示海洋、"#"表示陸地,如下所示:

.......
.##....
.##....
....##.
..####.
...###.
.......

其中"上下左右"四個方向上連在一起的一片陸地組成一座島嶼。例如上圖就有2座島嶼。  

由于全球變暖導致了海面上升,科學家預測未來幾十年,島嶼邊緣一個像素的范圍會被海水淹沒。具體來說如果一塊陸地像素與海洋相鄰(上下左右四個相鄰像素中有海洋),它就會被淹沒。  

例如上圖中的海域未來會變成如下樣子:

.......
.......
.......
.......
....#..
.......
.......

請你計算:依照科學家的預測,照片中有多少島嶼會被完全淹沒。  
【輸入格式】
第一行包含一個整數N。  (1 <= N <= 1000)  
以下N行N列代表一張海域照片。  

照片保證第1行、第1列、第N行、第N列的像素都是海洋。  
【輸出格式】
一個整數表示答案。
【輸入樣例】
7 
.......
.##....
.##....
....##.
..####.
...###.
.......  
【輸出樣例】
1  
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴于編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

解題思路:

這個題我認為就是要解決兩件事,一個是如何從給出的圖中統計出海島的數量,另一個就是如何根據全球變暖前的圖推算出全球變暖后的圖。。。比較尷尬的是我在比賽時只解決了后一個問題。。。。第一個不會。。。比賽結束后我得知可以用并查集的思想去解決這類連通問題(八連通,四連通。。。)問題是我比賽前兩天剛剛看了并查集emmmmmmm真是虧死了。。。。。≧ ﹏ ≦

PS:電腦硬盤報廢了。。。。代碼后天更新吧{{{(>_<)}}}

—————————————————2018.4.2更新 分割線———————————————

//暴力解法請等待更新(*/ω\*)
//非暴力解法請等待更新(*/ω\*)

10. 乘積最大(程序設計)(滿分25分)

注意事項:問題的描述在考生文件夾下對應題號的“題目.txt”中。相關的參考文件在同一目錄中。請先閱讀題目,必須通過編程的方式解決問題。注意事項同上題

題目描述:

給定N個整數A1, A2, ... AN。請你從中選出K個數,使其乘積最大。

請你求出最大的乘積,由于乘積可能超出整型范圍,你只需輸出乘積除以1000000009的余數。

注意,如果X<0, 我們定義X除以1000000009的余數是負(-X)除以1000000009的余數。
即:0-((0-x) % 1000000009)

【輸入格式】
第一行包含兩個整數N和K。  
以下N行每行一個整數Ai。  

對于40%的數據,1 <= K <= N <= 100  
對于60%的數據,1 <= K <= 1000  
對于100%的數據,1 <= K <= N <= 100000  -100000 <= Ai <= 100000  
【輸出格式】
一個整數,表示答案。
【輸入樣例】
5 3 
-100000   
-10000   
2   
100000  
10000  
【輸出樣例】
999100009

再例如:

【輸入樣例】
5 3 
-100000   
-100000   
-2   
-100000  
-100000
【輸出樣例】
-999999829
資源約定:
峰值內存消耗(含虛擬機) < 256M
CPU消耗  < 1000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入...” 的多余內容。
注意:
main函數需要返回0;
只使用ANSI C/ANSI C++ 標準;
不要調用依賴于編譯環境或操作系統的特殊函數。
所有依賴的函數必須明確地在源文件中 #include <xxx>
不能通過工程設置而省略常用頭文件。

提交程序時,注意選擇所期望的語言類型和編譯器類型。

解題思路:還沒有更新吶親\( ̄︶ ̄*\))

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容