天津大學智能學部 2020 推免機試真題
寫在前面,本人非計科軟工-編程小小白一枚,原以爲機試題目和夏令營機試題目差不多,就沒準備很多。現在真的打臉了… 爲了給以後推免的同學有個心裏準備,現將機試所見所聞總結如下。
機試要求
- 只能用 C/C++,codeblocks,dev 都可以。
- 不能用萬能頭文件,不支持 C++11,應該是 98 的,時間 1h 30min。
- ,題目難度分佈不定。
- 前兩題短一點,後兩題長一點,英文,還要動點腦子理解。
好吧,小白的我就看了兩道題,AC一道,還一道沒調好。
後面兩大題想騙分的,結果沒騙到 0.0
第一題
不折騰英文了,剛開始我都沒看懂題目
大意是,給定一個字符串,請在它所有的子字符串中找出符合以下條件的子字符串的個數:子字符串中的每個字符數目不超過 。
部分範圍不記得了。
-
輸入格式:
- 第一行 ,表示要判斷的組數。
- ,表示子串中字符不能超過的數目。
- ,表示輸入的字符串。
-
輸出格式:
- ,表示符合條件的個數。
-
輸入樣例:
- 3
- 1
- abc
- 1
- abcabc
- 2
- abcabc
-
輸出樣例:
- 6
- 15
- 21
-
我的解法,當時沒調好 -。-
-
(對了,下面用我電腦C++11寫的,朋友要稍微修改一下到98)
#include <iostream>
#include <string>
#include <map>
#include <set>
using namespace std;
// 判斷字串是否符合規則
bool judge(string subs, int n){
// 假設這個字符串符合規則
int flag = 1;
// 字串中所有不同的字符插入集合ss中
set<char> ss;
for(int i = 0; i < subs.length(); i++){
ss.insert(subs[i]);
}
// 利用映射查看每個ss中的字符在原字符串中出現的次數
map<char,int> mapp;
for(auto i = ss.begin(); i != ss.end(); i++){
for(int j = 0; j < subs.length(); j++){
if(*i == subs[j]){
mapp[*i]++;
int sma = mapp[*i];
if(sma > n){
flag = 0;
}
if(!flag)break;
}
if(!flag)break;
}
}
return flag;
}
// 遍歷所有字串
int substr_num(string s, int n){
int sum = 0;
for(int i = 1; i <= s.length(); i++){
for(int j = 0; j <= s.length() - i; j++){
if(judge(s.substr(j,i),n)){
sum++;
}
}
}
return sum;
}
// main function
int main() {
ios::sync_with_stdio(false);
int T;
cin >> T;
while(T--){
int num;
string tmp;
cin >> num >> tmp;
cout << substr_num(tmp, num) << endl;
}
return 0;
}
第二題
大致題意:
$ F[x] $ 滿足 x 的所有位數相加,即:
現在要在不大於 的正整數 中找出符合 爲素數的數字的個數。
-
輸入格式:
- 第一行 ,表示要判斷的組數。
- ,表示要求中的數。
-
輸出格式:
- ,表示符合條件的數字的個數。
-
輸入樣例:
- 3
- 10
- 2
- 4
-
輸出樣例:
- 4
- 1
- 2
#include <iostream>
using namespace std;
// main function
int main() {
ios::sync_with_stdio(false);
// 優化的預處理-埃氏篩素數
int is_prime[1002] = {0};
for(int i = 2; i < 1002; i++){
is_prime[i] = 1; // 爲素數
}
for(int i = 2; i*i < 1002; i++){
if(is_prime[i]){
for(int j = i*i; j < 1002; j += i){
is_prime[j] = 0; // 非素數
}
}
}
// 寫好 F[x] 的值存好
int F[1002] = {0};
for(int i = 1; i < 1002; i++){
int sum = 0;
int gewei = 0;
int shiwei = 0;
int baiwei = 0;
int qianwei = 0;
if(i >=1 && i <=9){
gewei = i%10;
}
if(i >=10 && i <=99){
gewei = i%10;
shiwei = i/10%10;
}
if(i >=100 && i <=999){
gewei = i%10;
shiwei = i/10%10;
baiwei = i/100%10;
}
if(i >=1000 && i <=9999){
gewei = i%10;
shiwei = i/10%10;
baiwei = i/100%10;
qianwei = i/1000%10;
}
sum = gewei + shiwei + baiwei + qianwei;
F[i] = sum;
}
int T;
cin >> T;
while(T--){
int num;
int sum = 0; // 符合條件數字的個數
cin >> num;
for(int i = 1; i <= num; i++){
if(is_prime[F[i]]){
sum++;
}
}
cout << sum << endl;
}
return 0;
}