第九屆藍(lán)橋杯大賽個(gè)人賽省賽(軟件類(lèi))C/C++ 大學(xué)B組比賽心得(還在更新)

第九屆藍(lán)橋杯大賽個(gè)人賽省賽(軟件類(lèi))C/C++ 大學(xué)B組

考生須知:

  1. 考試開(kāi)始后,選手首先下載題目,并使用考場(chǎng)現(xiàn)場(chǎng)公布的解壓密碼解壓試題。

  2. 考試時(shí)間為4小時(shí)。時(shí)間截止后,提交答案無(wú)效。

  3. 在考試強(qiáng)制結(jié)束前,選手可以主動(dòng)結(jié)束考試(需要身份驗(yàn)證),結(jié)束考試后將無(wú)法繼續(xù)提交或?yàn)g覽答案。

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

  5. 對(duì)同一題目,選手可多次提交答案,以最后一次提交的答案為準(zhǔn)。

  6. 選手切勿在提交的代碼中書(shū)寫(xiě)“姓名”、“考號(hào)”,“院校名”等與身份有關(guān)的信息或其它與競(jìng)賽題目無(wú)關(guān)的內(nèi)容,否則成績(jī)無(wú)效。

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

  8. 試題包含三種類(lèi)型:“結(jié)果填空”、“代碼填空”與“程序設(shè)計(jì)”。

    1. 結(jié)果填空題:要求選手根據(jù)題目描述直接填寫(xiě)結(jié)果。求解方式不限。不要求源代碼。把結(jié)果填空的答案直接通過(guò)網(wǎng)頁(yè)提交即可,不要書(shū)寫(xiě)多余的內(nèi)容。

    2. 代碼填空題:要求選手在弄清給定代碼工作原理的基礎(chǔ)上填寫(xiě)缺失的部分,使得程序邏輯正確、完整。把代碼填空的答案(僅填空處的答案,不包括題面已存在的代碼或符號(hào))直接通過(guò)網(wǎng)頁(yè)提交即可,不要書(shū)寫(xiě)多余的內(nèi)容。使用ANSI C/ANSI C++ 標(biāo)準(zhǔn),不要依賴操作系統(tǒng)或編譯器提供的特殊函數(shù)。

    3. 程序設(shè)計(jì)題目:要求選手設(shè)計(jì)的程序?qū)τ诮o定的輸入能給出正確的輸出結(jié)果??忌某绦蛑挥心苓\(yùn)行出正確結(jié)果才有機(jī)會(huì)得分。

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

題目們(づ ̄ 3 ̄)づ:

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

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,不限解決問(wèn)題的方式,只要求提交結(jié)果。必須通過(guò)瀏覽器提交答案。

題目描述:

2000年的1月1日,是那一年的第1天。那么,2000年的5月4日,是那一年的第幾天?注意:需要提交的是一個(gè)整數(shù),不要填寫(xiě)任何多余內(nèi)容。

解題思路:

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

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

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,不限解決問(wèn)題的方式,只要求提交結(jié)果。必須通過(guò)瀏覽器提交答案。

題目描述:

漢字的字形存在于字庫(kù)中,即便在今天,16點(diǎn)陣的字庫(kù)也仍然使用廣泛。
16點(diǎn)陣的字庫(kù)把每個(gè)漢字看成是16x16個(gè)像素信息。并把這些信息記錄在字節(jié)中。

一個(gè)字節(jié)可以存儲(chǔ)8位信息,用32個(gè)字節(jié)就可以存一個(gè)漢字的字形了。
把每個(gè)字節(jié)轉(zhuǎn)為2進(jìn)制表示,1表示墨跡,0表示底色。每行2個(gè)字節(jié),
一共16行,布局是:

第1字節(jié),第2字節(jié)
第3字節(jié),第4字節(jié)
....
第31字節(jié), 第32字節(jié)

這道題目是給你一段多個(gè)漢字組成的信息,每個(gè)漢字用32個(gè)字節(jié)表示,這里給出了字節(jié)作為有符號(hào)整數(shù)的值。

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

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

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 

注意:需要提交的是一個(gè)整數(shù),不要填寫(xiě)任何多余內(nèi)容。

解題思路:

這個(gè)題好多人做的很懵的樣子欸(⊙?⊙),或許是我同時(shí)打CTF的原因,所以我趕腳還好啊(????)。標(biāo)準(zhǔn)的隱寫(xiě)術(shù)啊(╯‵□′)╯︵┻━┻。

**坑點(diǎn):1.九的九次方不是81啊喂(#`O′)。2.沒(méi)讓填十個(gè)漢字不是嗎?都說(shuō)了需要提交的是一個(gè)整數(shù)<@_@>

貼代碼:

#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. 乘積尾零(結(jié)果填空) (滿分13分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,不限解決問(wèn)題的方式,只要求提交結(jié)果。必須通過(guò)瀏覽器提交答案。

題目描述:

如下的10行數(shù)據(jù),每行有10個(gè)整數(shù),請(qǐng)你求出它們的乘積的末尾有多少個(gè)零?

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 

注意:需要提交的是一個(gè)整數(shù),表示末尾零的個(gè)數(shù)。不要填寫(xiě)任何多余內(nèi)容。

解題思路:

這個(gè)題當(dāng)時(shí)一看就要用大數(shù)運(yùn)算,在加上突然發(fā)現(xiàn)機(jī)子上是全環(huán)境于是。。。我默默打開(kāi)了Eclipse,我一看。。全英文界面Σ(っ °Д °;)っ(我英文不好被關(guān)了起來(lái)~>_<~)于是憑記憶把自動(dòng)補(bǔ)全打開(kāi)。接著調(diào)用BigInteger類(lèi)

報(bào)錯(cuò)報(bào)出天際。。。つ﹏?,我默默關(guān)了Eclipse就放棄了這個(gè)題。。。老闊疼。。。

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

就是,要求末尾0的個(gè)數(shù)就相當(dāng)于一個(gè)數(shù)為一個(gè)整數(shù)乘以10的n次冪(那個(gè)數(shù)由100個(gè)數(shù)相乘而來(lái)),求n的最大值,那么,問(wèn)題就可以轉(zhuǎn)化為,求每個(gè)數(shù)的2*5存在的個(gè)數(shù),累乘即可。

#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. 摔手機(jī)(誤)測(cè)試次數(shù)(結(jié)果填空) (滿分17分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,不限解決問(wèn)題的方式,只要求提交結(jié)果。必須通過(guò)瀏覽器提交答案。

題目描述:

x星球的居民脾氣不太好,但好在他們生氣的時(shí)候唯一的異常舉動(dòng)是:摔手機(jī)。
各大廠商也就紛紛推出各種耐摔型手機(jī)。x星球的質(zhì)監(jiān)局規(guī)定了手機(jī)必須經(jīng)過(guò)耐摔測(cè)試,并且評(píng)定出一個(gè)耐摔指數(shù)來(lái),之后才允許上市流通。

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

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

為了減少測(cè)試次數(shù),從每個(gè)廠家抽樣3部手機(jī)參加測(cè)試。

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

請(qǐng)?zhí)顚?xiě)這個(gè)最多測(cè)試次數(shù)。

注意:需要填寫(xiě)的是一個(gè)整數(shù),不要填寫(xiě)任何多余內(nèi)容。

解題思路:

這個(gè)題。。。。emmmmm我先發(fā)張圖大家自行體會(huì)下。。。

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

算法競(jìng)賽入門(mén)經(jīng)典這本書(shū)上有原題在P292的例題 9-20。。。。。。

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

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,不限解決問(wèn)題的方式。只要求填寫(xiě)缺失的代碼部分,千萬(wàn)不要畫(huà)蛇添足,填寫(xiě)多余的已有代碼或符號(hào)。必須通過(guò)瀏覽器提交答案。

題目描述:

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

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

請(qǐng)仔細(xì)閱讀分析源碼,填寫(xiě)劃線部分缺失的內(nèi)容。

#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;
}

注意:只填寫(xiě)劃線部分缺少的代碼,不要抄寫(xiě)已經(jīng)存在的代碼或符號(hào)。

解題思路:

這個(gè)題。。。我比賽的時(shí)候。。我想當(dāng)然的填了a, l, i + 1, k,后來(lái)發(fā)現(xiàn)是錯(cuò)的。。。

/(ㄒoㄒ)/~~

正確答案應(yīng)該是這個(gè)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;//隨機(jī)定位一個(gè)基準(zhǔn)下標(biāo) 
    int x = a[p];//將基準(zhǔn)下標(biāo)代表的數(shù)字取出 
    /*這里由于已經(jīng)把基準(zhǔn)值存入了x中,所以可以認(rèn)為a[p]是挖了一個(gè)坑,可以填數(shù)據(jù)*/
    {int t = a[p]; a[p] = a[r]; a[r] = t;}//將挖的坑移至數(shù)組尾端 
    int i = l, j = r;//i作為從前向后檢索的下表,j作為從后向前檢索的下標(biāo) 
    while(i < j) {//快速排序
        while(i < j && a[i] < x) i++;//如果有值比基準(zhǔn)值小且在基準(zhǔn)值左方那么不變
        if(i < j) {//如果有值比基準(zhǔn)值大且在基準(zhǔn)值左方
            a[j] = a[i];//用這個(gè)值把坑填上
            j--;//j下標(biāo)向前移動(dòng)
        }//此時(shí)i指向了那個(gè)坑
        while(i < j && a[j] > x) j--;//如果有值比基準(zhǔn)值大且在基準(zhǔn)值右方那么不變
        if(i < j) {//如果有值比基準(zhǔn)值小且在基準(zhǔn)值右方
            a[i] = a[j];//再次把坑填上
            i++;//i下標(biāo)向后移動(dòng)
        }
    }
    a[i] = x;//把x的值扔回去,此時(shí),比x小的值都在其左側(cè),比x大的值都在其右側(cè)。
    p = i;//此時(shí)x是第幾個(gè)數(shù),就是第幾小的數(shù)。
    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.遞增三元組(程序設(shè)計(jì))(滿分11分)

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

題目描述:

   給定三個(gè)整數(shù)數(shù)組

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

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

?

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

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

請(qǐng)嚴(yán)格按要求輸出,不要畫(huà)蛇添足地打印類(lèi)似:“請(qǐng)您輸入...” 的多余內(nèi)容。
注意:
main函數(shù)需要返回0;
只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
所有依賴的函數(shù)必須明確地在源文件中 #include \<xxx>
不能通過(guò)工程設(shè)置而省略常用頭文件。

提交程序時(shí),注意選擇所期望的語(yǔ)言類(lèi)型和編譯器類(lèi)型。

解題思路:

考試的時(shí)候我直接就用的暴力解法了。<( ̄ˇ ̄)/。。非暴力不會(huì)啊。。/(ㄒ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;
}
//非暴力解法請(qǐng)等待更新(*/ω\*)

7.螺旋折線(程序設(shè)計(jì))(滿分19分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,必須通過(guò)編程的方式解決問(wèn)題。注意事項(xiàng)同上題

題目描述:

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

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

給出整點(diǎn)坐標(biāo)(X, Y),你能計(jì)算出dis(X, Y)嗎?

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

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

請(qǐng)嚴(yán)格按要求輸出,不要畫(huà)蛇添足地打印類(lèi)似:“請(qǐng)您輸入...” 的多余內(nèi)容。
注意:
main函數(shù)需要返回0;
只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
所有依賴的函數(shù)必須明確地在源文件中 #include <xxx>
不能通過(guò)工程設(shè)置而省略常用頭文件。

提交程序時(shí),注意選擇所期望的語(yǔ)言類(lèi)型和編譯器類(lèi)型。

解題思路:

這個(gè)我直接考慮的是點(diǎn)的轉(zhuǎn)移。= ̄ω ̄=

例如:

如果一個(gè)點(diǎn)在第一象限(x,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第二象限(-x,y)

如果一個(gè)點(diǎn)在第二象限(x,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第三象限(x,-y+1)

特別的,如果該點(diǎn)在(-1,1),那么接下來(lái)它會(huì)轉(zhuǎn)移到x軸上(-1,0)

如果一個(gè)點(diǎn)在第三象限(x,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第四象限(-x-1,y)

如果一個(gè)點(diǎn)在第四象限(x,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第一象限(x,-y)

如果一個(gè)點(diǎn)在x軸正半軸(x,0),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第一象限(x,x)

如果一個(gè)點(diǎn)在y軸正半軸(0,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第二象限(y,y)

如果一個(gè)點(diǎn)在x軸負(fù)半軸(x,0),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第三象限(x,x+1)

特別的,如果該點(diǎn)在(-1,0),那么接下來(lái)它會(huì)轉(zhuǎn)移到原點(diǎn)(0,0)

如果一個(gè)點(diǎn)在y軸負(fù)半軸(0,y),那么接下來(lái)它必然會(huì)轉(zhuǎn)移到第四象限(-y,y)

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

//暴力解法
#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;
}
//非暴力解法請(qǐng)等待更新(*/ω\*)

8. 日志統(tǒng)計(jì)(程序設(shè)計(jì))(滿分21分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,必須通過(guò)編程的方式解決問(wèn)題。注意事項(xiàng)同上題

題目描述:

小明維護(hù)著一個(gè)程序員論壇?,F(xiàn)在他收集了一份"點(diǎn)贊"日志,日志共有N行。其中每一行的格式是:

ts id

表示在ts時(shí)刻編號(hào)id的帖子收到一個(gè)"贊"。

現(xiàn)在小明想統(tǒng)計(jì)有哪些帖子曾經(jīng)是"熱帖"。如果一個(gè)帖子曾在任意一個(gè)長(zhǎng)度為D的時(shí)間段內(nèi)收到不少于K個(gè)贊,小明就認(rèn)為這個(gè)帖子曾是"熱帖"。

具體來(lái)說(shuō),如果存在某個(gè)時(shí)刻T滿足該帖在[T, T+D)這段時(shí)間內(nèi)(注意是左閉右開(kāi)區(qū)間)收到不少于K個(gè)贊,該帖就曾是"熱帖"。

給定日志,請(qǐng)你幫助小明統(tǒng)計(jì)出所有曾是"熱帖"的帖子編號(hào)。

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

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

請(qǐng)嚴(yán)格按要求輸出,不要畫(huà)蛇添足地打印類(lèi)似:“請(qǐng)您輸入...” 的多余內(nèi)容。
注意:
main函數(shù)需要返回0;
只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
所有依賴的函數(shù)必須明確地在源文件中 #include <xxx>
不能通過(guò)工程設(shè)置而省略常用頭文件。

提交程序時(shí),注意選擇所期望的語(yǔ)言類(lèi)型和編譯器類(lèi)型。

解題思路:

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

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

//暴力解法
#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;
    }
}
//非暴力解法請(qǐng)等待更新(*/ω\*)

9.全球變暖(程序設(shè)計(jì))(滿分23分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,必須通過(guò)編程的方式解決問(wèn)題。注意事項(xiàng)同上題

題目描述:

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

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

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

由于全球變暖導(dǎo)致了海面上升,科學(xué)家預(yù)測(cè)未來(lái)幾十年,島嶼邊緣一個(gè)像素的范圍會(huì)被海水淹沒(méi)。具體來(lái)說(shuō)如果一塊陸地像素與海洋相鄰(上下左右四個(gè)相鄰像素中有海洋),它就會(huì)被淹沒(méi)。  

例如上圖中的海域未來(lái)會(huì)變成如下樣子:

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

請(qǐng)你計(jì)算:依照科學(xué)家的預(yù)測(cè),照片中有多少島嶼會(huì)被完全淹沒(méi)。  
【輸入格式】
第一行包含一個(gè)整數(shù)N。  (1 <= N <= 1000)  
以下N行N列代表一張海域照片。  

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

請(qǐng)嚴(yán)格按要求輸出,不要畫(huà)蛇添足地打印類(lèi)似:“請(qǐng)您輸入...” 的多余內(nèi)容。
注意:
main函數(shù)需要返回0;
只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
所有依賴的函數(shù)必須明確地在源文件中 #include <xxx>
不能通過(guò)工程設(shè)置而省略常用頭文件。

提交程序時(shí),注意選擇所期望的語(yǔ)言類(lèi)型和編譯器類(lèi)型。

解題思路:

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

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

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

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

10. 乘積最大(程序設(shè)計(jì))(滿分25分)

注意事項(xiàng):?jiǎn)栴}的描述在考生文件夾下對(duì)應(yīng)題號(hào)的“題目.txt”中。相關(guān)的參考文件在同一目錄中。請(qǐng)先閱讀題目,必須通過(guò)編程的方式解決問(wèn)題。注意事項(xiàng)同上題

題目描述:

給定N個(gè)整數(shù)A1, A2, ... AN。請(qǐng)你從中選出K個(gè)數(shù),使其乘積最大。

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

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

【輸入格式】
第一行包含兩個(gè)整數(shù)N和K。  
以下N行每行一個(gè)整數(shù)Ai。  

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

再例如:

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

請(qǐng)嚴(yán)格按要求輸出,不要畫(huà)蛇添足地打印類(lèi)似:“請(qǐng)您輸入...” 的多余內(nèi)容。
注意:
main函數(shù)需要返回0;
只使用ANSI C/ANSI C++ 標(biāo)準(zhǔn);
不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
所有依賴的函數(shù)必須明確地在源文件中 #include <xxx>
不能通過(guò)工程設(shè)置而省略常用頭文件。

提交程序時(shí),注意選擇所期望的語(yǔ)言類(lèi)型和編譯器類(lèi)型。

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,208評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,746評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,666評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,477評(píng)論 6 407
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,960評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,200評(píng)論 0 288
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,726評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,617評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,807評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,049評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,425評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,674評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,432評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,769評(píng)論 2 372

推薦閱讀更多精彩內(nèi)容