天津大學智能學部夏令營機試彙總
以下內容不完全確保 AC
文章目錄
注意事項
- 英文題目,三道題,閱讀難度不高。
- 編譯環境是 codeblocks。
- POJ三種狀態:通過,部分通過,沒有通過。
- 不能用 Java,不能用 萬能頭文件 <bits/stdc++.h>
2018年智能學部夏令營機試
問題1:求斐波那契數列的第n個數字
-
有如下的斐波那契數列
第一行給你一個 ,表示接下來要輸入 行數字
剩下 行每行輸入數字
要求輸出數列中第 個數,記爲
如果 數字太大,則輸出 -
3
0
1
5 -
0
1
5 -
#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:加密算法
-
有兩個人互傳信息,使用加密算法。
小寫字母變成他後面的一位,大寫字母變成小寫字母。
第一行給你一個 ,表示接下來要輸入 行字符串。
剩下 行每行輸入字符串,最後輸出加密後結果。 -
3
aabc
ccba
AAbb -
bbcd
ddcb
aabb -
#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:最大三角形
-
小紅和小明要做風箏,小紅認爲直角三角形的風箏最好了。
但他們只有 根木棍,要從中間選出可以做成最大直角三角形的三根。
輸入
第一行給你一個 ,表示接下來要做 個風箏,
剩下每次輸入一個數 ,表示現有 根木棍,
後面一行輸入 個數字,表示這幾根木棍的長度。
輸出
輸出能拼成最大三角形的三根木棍(升序輸出)。 -
2
5
3 6 8 4 5
6
3 12 4 5 13 10 -
3 4 5
5 12 13 -
#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:魔術串
-
輸入的字符串是否爲magical string——即要使字符串滿足連續的 ( 爲正整數)個 ‘>’ 後跟 個 ‘<’ ,至少需要進行多少次的轉換(轉換指 ‘>’ 和 ‘<’ 之間的互相轉換),每次可以將一個左括號改成右括號,或者右括號改成左括號。
輸入說明:第一行爲輸入的字符串總的行數,且輸入字符串的長度爲偶數。
字符串長度大概 。 -
2
>><<><
>><< -
2
0 -
#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:旅遊最多的城市
-
求一個人去旅遊能到達的最多的城市。
輸入說明:第一行爲輸入的輸入樣例組數 ,接着爲 ,( 爲這個人旅行的總天數, 爲計劃旅行的總城市數),接下來一行爲一個整數 ,每一位依次表示遊覽每個城市所需的天數。輸出旅遊最多的城市數目。 -
2
5 5
1 1 1 1 1
5 4
1 4 2 2 -
5
3 -
#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 地址
-
簡單描述:給定一個只包含數字的字符串,復原它並返回所有可能的 IP 地址格式。
複雜描述:插入三個 ‘.’ 形成
(A、B、C、D 在 [0,255] 之間,且不能以 0 作爲前綴)判斷能組成的ip的個數。
輸入說明:第一行爲輸入字符串的行數,接下來依次輸入字符串。
注意: 是可以組成有效 ip 地址 的,
但是 是無效 地址因爲破壞了前綴不能爲 的規則。
可以有兩種組合:(1)255.255.11.123;(2)255.255.111.23。
參考題目來源 -
2
0000
25525511123 -
1
2 -
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;
}
};