天津大學18-19夏令營機試彙總

天津大學智能學部夏令營機試彙總

以下內容不完全確保 AC

注意事項

  • 英文題目,三道題,閱讀難度不高。
  • 編譯環境是 codeblocks。
  • POJ三種狀態:通過,部分通過,沒有通過。
  • 不能用 Java,不能用 萬能頭文件 <bits/stdc++.h>

2018年智能學部夏令營機試

問題1:求斐波那契數列的第n個數字

  • {\color{Gray}{問題描述}}
    有如下的斐波那契數列 0,1,1,2,3,5,80,1,1,2,3,5,8……
    第一行給你一個 TT,表示接下來要輸入 TT 行數字0<T<10000(0<T<10000)
    剩下 TT 行每行輸入數字 NN 0<=N<=100000(0<=N<=100000)
    要求輸出數列中第 NN 個數,記爲 RESULTRESULT
    如果 NN 數字太大,則輸出 Resultmod1e9+7Result \quad mod \quad 1e9+7

  • {\color{Gray}{示例輸入}}
    3
    0
    1
    5

  • {\color{Gray}{示例輸出}}
    0
    1
    5

  • {\color{Gray}{代碼解析}}

#include <iostream>
#define mod 1000000007 // 模
#define ll long long int // 數據類型
#define M 10000000 // Fib 數列
using namespace std;

int main(){
    // 同步
    ios::sync_with_stdio(false);
    // 存儲數列
    ll *fib = new ll[M];
    fib[0] = 0;
    fib[1] = 1;
    for(int i = 2; i < M; i++){
        fib[i] = fib[i-1]%mod + fib[i-2]%mod;
    }
    // 操作
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        int num;
        cin >> num;
        cout << fib[num] << endl;
    }
    return 0;
}

問題2:加密算法

  • {\color{Gray}{問題描述}}
    有兩個人互傳信息,使用加密算法。
    小寫字母變成他後面的一位,大寫字母變成小寫字母。
    a>b,b>c,z>a,A>aa->b,\quad b->c,\quad z->a,\quad A->a
    第一行給你一個 TT,表示接下來要輸入 TT 行字符串。
    剩下 TT 行每行輸入字符串,最後輸出加密後結果。

  • {\color{Gray}{示例輸入}}
    3
    aabc
    ccba
    AAbb

  • {\color{Gray}{示例輸出}}
    bbcd
    ddcb
    aabb

  • {\color{Gray}{代碼解析}}

#include <iostream>

using namespace std;

// deal with the string
string str2astr(string s){
    for(int i = 0; i < s.size(); i++){
        if(s[i] == 'z')s[i] = 'a';
        if(s[i] >= 'a' && s[i] < 'z'){
            s[i] += 1;
        }
    }
    for(int i = 0; i < s.size(); i++){
        if(s[i] >= 'A' && s[i] <= 'Z'){
            s[i] -= ('A'-'a');
        }
    }
    return s;
}
// main function
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin >> T;
    for(int i = 0; i < T; i++){
        string tmp;
        cin >> tmp;
        cout << str2astr(tmp) << endl;
    }
    return 0;
}

問題3:最大三角形

  • {\color{Gray}{問題描述}}
    小紅和小明要做風箏,小紅認爲直角三角形的風箏最好了。
    但他們只有 nn 根木棍,要從中間選出可以做成最大直角三角形的三根。
    輸入
    第一行給你一個 TT,表示接下來要做 TT 個風箏,
    剩下每次輸入一個數 NN,表示現有 NN 根木棍,
    後面一行輸入 NN 個數字,表示這幾根木棍的長度。
    輸出
    輸出能拼成最大三角形的三根木棍(升序輸出)。

  • {\color{Gray}{示例輸入}}
    2
    5
    3 6 8 4 5
    6
    3 12 4 5 13 10

  • {\color{Gray}{示例輸出}}
    3 4 5
    5 12 13

  • {\color{Gray}{代碼解析}}

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

/*Global variable*/
int vis[1000000] = {0}; // if = 1, exists

/*Judge if =?*/
bool equalTri(int a, int b){
    int c2 = a*a + b *b;
    int c = sqrt(c2);
    if(c*c == c2 && vis[c]){return 1;}
    return 0;
}

/*Main function*/
int main(){
    ios::sync_with_stdio(false);
    // Input T, the number of kites
    int T;
    cin >> T;
    // deal with each kite
    while(T--){
        // stored memery
        int num = 0; // the number of sticks
        int setN[10000] = {0}; // sticks' set
        cin >> num;
        for(int i = 0; i < num; i++){
            cin >> setN[i];
            vis[setN[i]] = 1; // exists
        }
        // sort num
        sort(setN, setN + num);
        // Judge
        int ans[3] = {0}; // stored answer
        for(int i = 0; i < num; i++){
            for(int j = i+1; j < num; j++){
                if(equalTri(setN[i], setN[j]) && setN[i]*setN[j] > ans[0]*ans[1]){
                    ans[0] = setN[i];
                    ans[1] = setN[j];
                    ans[2] = sqrt(setN[i]*setN[i] + setN[j]*setN[j]);
                }
            }
        }
        sort(ans, ans+3);
        cout << ans[0] << " " << ans[1] << " " << ans[2] << endl;
    }
    return 0;
}

2019年智能學部夏令營機試

問題1:魔術串

  • {\color{Gray}{問題描述}}
    輸入的字符串是否爲magical string——即要使字符串滿足連續的 kkkk 爲正整數)個 ‘>’ 後跟 kk 個 ‘<’ ,至少需要進行多少次的轉換(轉換指 ‘>’ 和 ‘<’ 之間的互相轉換),每次可以將一個左括號改成右括號,或者右括號改成左括號。
    輸入說明:第一行爲輸入的字符串總的行數,且輸入字符串的長度爲偶數。
    字符串長度大概 10510^5

  • {\color{Gray}{示例輸入}}
    2
    >><<><
    >><<

  • {\color{Gray}{示例輸出}}
    2
    0

  • {\color{Gray}{代碼解析}}

#include <iostream>

using namespace std;

int main(){
    ios::sync_with_stdio(false);
    // Input
    int T;
    cin >> T;
    // Each step
    while(T--){
        string s;
        cin >> s;
        int num = 0;
        for(int i = 0; i < s.size()/2; i++){
            if(s[i] == '<')num++;
        }
        for(int i = s.size()/2+1; i < s.size(); i++){
            if(s[i] == '>')num++;
        }
        cout << num << endl;
    }
    return 0;
}

問題2:旅遊最多的城市

  • {\color{Gray}{問題描述}}
    求一個人去旅遊能到達的最多的城市。
    輸入說明:第一行爲輸入的輸入樣例組數 TT,接着爲 nnmmnn 爲這個人旅行的總天數,mm 爲計劃旅行的總城市數),接下來一行爲一個整數 d[i]d[i],每一位依次表示遊覽每個城市所需的天數。輸出旅遊最多的城市數目。

  • {\color{Gray}{示例輸入}}
    2
    5 5
    1 1 1 1 1
    5 4
    1 4 2 2

  • {\color{Gray}{示例輸出}}
    5
    3

  • {\color{Gray}{代碼解析}}

#include <iostream>
#include <algorithm>
using namespace std;
int main(){
    ios::sync_with_stdio(false);
    // Input
    int T;
    cin >> T;
    while(T--){
        int n, m; // days, cities
        int ans = 0; // answer
        cin >> n >> m;
        int costDays[m];
        for(int i = 0; i < m; i++){
            cin >> costDays[i];
        }
        sort(costDays, costDays+m);
        for(int i = 0; i < m; i++){
            if(n >= costDays[i]){
                ans++;
                n -= costDays[i];
            }
            else break;
        }
        cout << ans << endl;
    }
    return 0;
}

問題3:復原 IP 地址

  • {\color{Gray}{問題描述}}
    簡單描述:給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
    複雜描述:插入三個 ‘.’ 形成 A.B.C.DA.B.C.D
    (A、B、C、D 在 [0,255] 之間,且不能以 0 作爲前綴)判斷能組成的ip的個數。
    輸入說明:第一行爲輸入字符串的行數,接下來依次輸入字符串。
    注意:00000000 是可以組成有效 ip 地址 0.0.0.00.0.0.0 的,
    但是 0.010.0.00.010.0.0 是無效 ipip 地址因爲破壞了前綴不能爲 00 的規則。
    2552551112325525511123 可以有兩種組合:(1)255.255.11.123;(2)255.255.111.23。
    參考題目來源

  • {\color{Gray}{示例輸入}}
    2
    0000
    25525511123

  • {\color{Gray}{示例輸出}}
    1
    2

  • {\color{Gray}{代碼解析}}

{\color{Red}{此題過幾天再看,先給出標準答案}}

class Solution {
public:
    vector<string> res;
    
    vector<string> restoreIpAddresses(string s) {
        string temp;
        dfs(s,temp,0);
        return res;
    }
    
    void dfs(string s, string& temp, int word_num){
        if(word_num == 4){
            if(s.empty()) res.push_back(temp);
        }
        else{
            if(word_num > 0) temp += '.';
            for(int i = 1; i <= 3 && i <= s.length(); ++i){
                if(valid(s.substr(0,i))){
                    temp += s.substr(0,i);
                    dfs(s.substr(i,s.length()-i),temp,word_num+1);
                    temp.erase(temp.length()-i,i);
                }
            }
            temp.pop_back();
        }
    }
    
    bool valid(const string& s){
        if(s.empty() || (s[0] == '0' && s.size()>1) ) return false;
        int val = stoi(s);
        if(val >= 0 && val <= 255) return true;
        return false;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章