1. 程式人生 > >2019年1月“最強程式碼”冬季賽

2019年1月“最強程式碼”冬季賽

 

這是一個簽到題

 

Description

 

眾所周知,中國礦業大學將在2019年6月1日迎來建校110週年。但是Alice想知道在哪一年中國礦業大學會迎來n週年紀念。

 

Input

 

一行,一個整數n(1<=n<=200),代表中國礦業大學n週年。

 

Output

 

在一行中輸出一個正整數x,表示在x年,中國礦業大學會迎來n週年紀念。

 

Sample Input 1 

110

Sample Output 1

2019

 

AC code:

#include<iostream>

using namespace std;

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

    cout << n + 1909 << endl;
    
	return 0; 
}

  

壯壯與月亮女神

 

Description

 

能與壯壯哥平分秋色的放眼學校僅有月亮女神一人。這天你奉壯壯哥之名勸說月亮女神歸順壯壯哥。但是作為全校第二能打的,豈是那麼輕易就能見面的?月亮女神宿舍門上有一個n階方陣,如果你能按照s型依次將1~n^2填入方陣,你就能見到月亮女神。

 

Input

 

一行,一個整數n代表矩陣的階數(0 < n < 500)

 

Output

 

n行,每行n個整數,用空格分隔,代表第i行矩陣元素。

 

Sample Input 1 

3

Sample Output 1

1 2 3
6 5 4
7 8 9

 

AC code:

#include <iostream>
#include <vector>

using namespace std;

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

    vector<vector<int>> temp(n, vector<int>(n, 0));

    int flag = 1;
    int curNum = 1;

    for (int i = 0; i < n; ++i) {
        if (flag == 1) {
            for (int j = 0; j < n; ++j) {
                temp[i][j] = curNum++;
            }
            flag = 0;
        } else {
            for (int j = n-1; j >= 0; --j) {
                temp[i][j] = curNum++;
            }
            flag = 1;
        }
    }

    for (int i = 0; i < n; ++i) {
        cout << temp[i][0];
        for (int j = 1; j < n; ++j) {
            cout << " " << temp[i][j];
        }
        cout << endl;
    }

    return 0;
}

  

月亮女神的魔法

 

Description

 

月亮女神是田徑好手,有一天她在參加扔鐵餅比賽時,慘遭壯壯哥的羞辱,0:5慘敗!於是次日她想用魔法來找回面子。月亮女神會如下兩個魔法:1.月亮女神的加速:使鐵餅飛a米。2.月亮女神全身變:使a變為a+5。現給出初始的a與月亮女神可以使用魔法的次數t,求她最遠能將鐵餅扔多遠。

 

Input

 

一行,兩個整數,a和t,其含義如題意所述。(0<=a,t<=1000)

 

Output

 

一行,一個整數,即鐵餅最遠能飛多少米。

 

Sample Input 1 

20 20

Sample Output 1

720

 

my code:

#include <iostream>
#include <vector>

using namespace std;

int dfs(int m, int n, int temp);

vector<vector<int>> memo(10000, vector<int>(1005, 0));

int main() {
    int m, n;

    cin >> m >> n;

    cout << dfs(m, n, 0) << endl;

    return 0;
}

int dfs(int m, int n, int temp) {
    if (n <= 0) return temp;
    if (memo[m][n] != 0) return memo[m][n];
    memo[m][n] = temp;
    return max(dfs(m, n-1, temp+m), dfs(m+5, n-1, temp));
}

  

Analysis:

剛開始想到的就是用dfs來深搜,但是當資料達到100是就已經計算不出來結果了(TLE),於是我又加了一個memo用來儲存已經處理過的狀態,雖然速度提高了很多,但是最後提交的時候還是沒能通過。

 

壯壯的心理學

 

Description

 

別看壯壯又高又壯,但她其實是個心思細膩的女孩,也是個心理學高手!每天壯壯哥都要檢閱她的小弟,而小弟總會拍一句馬屁,壯壯想知道誰說的是真的,誰說的是假的。已知共n個人,依次從1~n編號,每個人說一句話,如果該話長度為奇數,即為假話,偶數為真話。

 

Input

 

第一行一個整數n(0<n<100000),為小弟個數。接下來n行,每行一個字串,為小弟說的話。

 

Output

 

一個整數a,a為說真話的人的總數。

 

Sample Input 1 

3
Zhuangzhuanggehaoshuai
Aaaa
lihai

 

AC code:

#include <iostream>

using namespace std;

int main()
{
    int n;
    cin >> n;
    int ans = 0;
    for (int i = 0; i < n; ++i) {
        string str;
        cin >> str;
        if (str.length() % 2 == 0)
            ans++;
    }

    cout << ans << endl;

    return 0;
}

  

統計某類完全平方數

 

Description

 

統計給定區間(100~n)內的三位數中有兩位數字相同的完全平方數(如144、676)的個數。

 

Input

 

一個整數n,(1000>n>=100)

 

Output

 

一個整數n。

 

Sample Input 1 

500

Sample Output 1

6

 

My code:
#include <iostream>

using namespace std;

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

    int ans = 0;
    for (int i = 11; i < 32 && i*i <= n; ++i) {
        int cur = i * i;
        int g = cur % 10;
        int s = (cur / 10) % 10;
        int b = (cur / 100) % 10;
      	cout << b << s << g << endl;
        if (g == s || g == b || s == b) ans++;
    }

    cout << ans << endl; 

    return 0;
}

  

 Analysis: 感覺是很簡單的一道題,但是不知道為什麼提交的時候總是出錯。    

會魔法的Alice

 

Description

 

Alice和Bob在一起玩一個遊戲,遊戲通關的條件是使這個數列的和為0,但有時候數列的和並不是0,但是Alice會魔法,她可以把一個數變成自己的相反數,並且Alice只有一次使用魔法的機會。請問你Alice和Bob能不能通關呢?當然,如果數列剛開始的和就是0,也可以通關。

 

Input

 

第一行包含一個正整數n(1<=n<=1e5),表示數列的個數第二行有n個數Xi(1<=i<=n, -100<=x<=100),表示這個數列。

 

Output

 

如果Alice和Bob可以通關,輸出“YES”,否則輸出“NO”。(輸出不包括雙引號)

 

Sample Input 1 

5
1 3 -5 3 4

Sample Output 1

YES

Hint

可以把其中一個3變為-3,最後數列和為0。符合通關條件。

 

AC code:

#include <iostream>
#include <vector>

using namespace std;

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

    vector<int> temp;

    int sum = 0;
    for (int i = 0; i < n; ++i) {
        int num;
        cin >> num;
        temp.push_back(num);
        sum += num;
    }

    if (sum == 0) {
        cout << "YES" << endl;
        return 0;
    }

    for (int i = 0; i < n; ++i) {
        if (temp[i] == sum/2) {
            cout << "YES" << endl;
            return 0;
        }
    }

    cout << "NO" << endl;
    return 0;
}

  

2^k的和

 

Description

 

如果一個正整數n滿足其值為2^k(其中k為正整數),例如32,16。我們稱這種數為2^k整數。但這種數畢竟很少,現在定義2^k半整數,雖然n不滿足2^k整數,但n可以由兩個2^k整數相加得到,這樣的n我們稱為2^k半整數(其中k為正整數)。當然2^k整數也滿足2^k半整數。例如32可以由16和16相加而成,48可以由32和16相加而成。

 

Input

 

第一行一個整數t(1<=t<=20),表示t組資料。接下來有t行,每行一個整數n。(1<=n<=1e6)

 

Output

 

如果n是2^k半整數,輸出Yes,否則輸出No。

 

Sample Input 1 

3
48
49
32

Sample Output 1

Yes
No
Yes

 

My code:

#include <iostream>
#include <vector>
#include <set>

using namespace std;

vector<int> temp;
set<int> memo;

void init(int x) {
    for (int i = 0; i < x; ++i) {
      	temp.push_back(2<<i);
      	memo.insert(2<<i);
    }
        
    for (int i = 0; i < temp.size(); ++i) {
        for (int j = 0; j < temp.size(); ++j) {
            memo.insert(temp[i]+temp[j]);
        }
    }
}

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

    init(20);

    for (int i = 0; i < n; ++i) {
        int num;
        cin >> num;
        if (memo.count(num)) 
            cout << "YES" << endl;
        else
            cout << "NO" << endl;
    }

    return 0;
}

  

Analysis:

我把所有的可能都遍歷出來,然後儲存在set中,然後在查詢,不知道為什麼最後還是會出錯。可能是不應該把兩個相同的數相加吧。

 

戰士、魔法師、射手

 

Description

 

這一天Bob接觸了角色扮演遊戲,其中包含戰士(warrior)、魔法師(enchanter)、射手(shooter)三個職業,Bob建立了n個賬號,每個賬號的編號是1~n,且沒有任何兩個賬號的編號相同。每個賬號的職業可能是戰士、魔法師、射手中的一種。這時候Bob定義了一種排序,職業排序。規則是這樣的:首先規定三個職業的先後順序,職業1,職業2,職業3,意味著這樣的順序:職業1的所有單位在職業2的所有單位和職業3的所有單位的前面,職業2的所有單位在職業3的所有單位之前。但是要注意:職業間的相對順序不發生改變。假如給出的排序規則是,warrior,enchanter,shooter,那麼所有的warrior排在最前面,緊接著是enchanter,最後shooter。如果其中沒有一個相對的職業,則跳過該種族

 

Input

 

第一行包含一個正整數n(1<=n<=100),代表Bob建立了n個賬號。接下來n行,每行的輸入一個字串,格式為:“ID is 職業”,中間以一個空格隔開。其中ID為1~n的正整數,且每個ID唯一。職業是一個字串,保證是warrior,enchanter,shooter 三種職業中的一種。最後一行包含三個字串:職業1 職業2 職業3。中間用一個空格隔開,代表職業排序的先後順序。

 

Output

 

對於每組資料,按照 職業1 職業2 職業3的排序規則,在一行輸出排序後的ID序列,兩個ID之間用一個空格隔開。

 

Sample Input 1 

5
1 is warrior
2 is enchanter
3 is shooter
4 is warrior
5 is warrior
warrior enchanter shooter

Sample Output 1

1 4 5 2 3

Sample Input 2 

4
1 is warrior
4 is warrior
3 is warrior
2 is shooter
shooter enchanter warrior

 

My code:

#include <iostream>
#include <map>
#include <vector>
#include <string>

using namespace std;

map<string, vector<int>> m;

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

    for (int i = 0; i < n; ++i) {
        string str;
        getline(cin, str);

        int pos1 = str.find(' ');
        string num = str.substr(0, pos1);

        int pos2 = str.find(' ', pos1+1);
        string name = str.substr(pos2+1);

        m[name].push_back(stoi(num));
    }

    vector<int> ans;

    string str;
    getline(cin, str);

    int pos1 = str.find(' ');
    string name1 = str.substr(0, pos1);
    if (m.count(name1))
        for (int i = 0; i < m[name1].size(); ++i) 
            ans.push_back(m[name1][i]);
            
    int pos2 = str.find(' ', pos1+1);
    string name2 = str.substr(pos1+1, pos2-pos1-1);
    if (m.count(name2))
        for (int i = 0; i < m[name2].size(); ++i) 
            ans.push_back(m[name2][i]);

    string name3 = str.substr(pos2+1);
    if (m.count(name3))
        for (int i = 0; i < m[name3].size(); ++i) 
            ans.push_back(m[name3][i]);
    
	if (!ans.empty()) {
        cout << ans[0];
        for (int i = 1; i < ans.size(); ++i) {
            cout << ' ' << ans[i];
        }
        cout << endl;
    }

    return 0;
}

  

Analysis:

用STL中的string操作了一波,樣例過了,但是最後還是沒有AC。

 

兩小兒又來取石子

 

Description

 

Alice和Bob這天又約出來一起玩遊戲,但這次取石子的方式稍有不同。有n個石子擺成一排,編號為1~n,Alice和Bob每次可以取1~k個連續編號的石子,假設他們都很聰明,都選取最優的選法,Alice先手,如果誰不能取石子了,則為輸。

注意:石子按照一排排列,例如n=3,k=2, 3個石子編號為1 2 3,每次可以取1~2個石子,Alice先把2號石子取走,這時候Bob不能拿走1 3,因為1和3號石子的編號不連續,Bob只能拿走1號或者2號石子,最後Alice拿走最後一個。Bob輸。

 

Input

 

兩個整數n和k。其中 0<=n<=100, 1<=k<=100。

 

Output

 

若Alice不能取石子,輸出“Bob”,否則輸出“Alice”。

 

Sample Input 1 

3 2

Sample Output 1

Alice

Sample Input 2 

2 1

Sample Output 2

Bob

 

Code:

 

waiting...........

 

校霸爭奪會

 

Description

 

新生入校,壯壯雙手抱胸,目光凌厲的審視著每一個新生,尋找可能的對手。校霸的評定分為琴棋書畫四個方面,雖然壯壯一樣不通,但是她能打,凡是報名校霸選舉的,都會被壯壯打到休學。不懂規矩的你一入學就報了名,現在你的內心忐忑不安,決定向壯壯哥示好。向壯壯示好最佳方式就是記住她的生日,壯壯哥會告訴你今天的日期以及她出生多少天了,請你算出她的生日。注意,如果不能在一秒鐘答出,你會捱揍。

 

Input

 

第一行是今天的日期,按yyyy mm dd形式給出。保證輸入日期合法。第二行一個整數t,表示壯壯出生了t天。(題目保證日期符合規範,0 <= t <= 100000,其中日期規則按照萬年曆,即國際通用日曆計算)

 

Output

 

一行,yyyy-mm-dd形式,代表壯壯出生日期。

 

Sample Input 1 

2019 01 10
10

Sample Output 1

2019-01-01

 

Code:

 

wait...........