PATB 解pat乙級題目

2021-10-04 09:07:46 字數 4713 閱讀 7052

記:最近為了準備考研機試所以寫寫pat習題和ccf題目,為了給自己設定乙個進度條,我便想把自己每日做的題目貼上來。一是可以看看自己每天到底學了什麼;而來也分享自己的題解。

如果有錯誤的地方,還請大家指出,非常謝謝!!

1085 pat單位排行 (25分)

每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。

輸入格式:

輸入第一行給出乙個正整數 n(≤10

​5​​ ),即考生人數。隨後 n 行,每行按下列格式給出乙個考生的資訊:

准考證號 得分 學校

其中准考證號是由 6 個字元組成的字串,其首字母表示考試的級別:b代表乙級,a代表甲級,t代表頂級;得分是 [0, 100] 區間內的整數;學校是由不超過 6 個英文本母組成的單位碼(大小寫無關)。注意:題目保證每個考生的准考證號是不同的。

輸出格式:

首先在一行中輸出單位個數。隨後按以下格式非降序輸出單位的排行榜:排名 學校 加權總分 考生人數

其中排名是該單位的排名(從 1 開始);學校是全部按小寫字母輸出的單位碼;加權總分定義為乙級總分/1.5 + 甲級總分 + 頂級總分*1.5的整數部分;考生人數是該屬於單位的考生的總人數。

學校首先按加權總分排行。如有並列,則應對應相同的排名,並按考生人數公升序輸出。如果仍然並列,則按單位碼的字典序輸出。

解題方法1:這種解放我檢視用乙個map存放key=學校,value是人數和加權總分。用到知識點map,vector,pair。 特別注意的是map底層是用紅黑樹實現的,因此它是按照key來排序的。而這裡我們用按照value排序所以我把它存入vector,在排序。可是提交後用乙個bug,便是取整的問題。22分

#include#include#include#include#include#includeusing namespace std;

struct cls;

typedef pairpair;

struct cmpbycls

else if(a.second.num != b.second.num) else

}};int main()

cnt++;

} vectorvv(mp.begin(),mp.end());

sort(vv.begin(),vv.end(),cmpbycls()); //給向量排序

/*for(vector::iterator it=vv.begin(); it != vv.end();it++)

cout《解法2:使用兩個map

#include#include#include#include#include#includeusing namespace std;

/* 使用兩個map來分別儲存人數和分數

*/struct node;

bool cmp(node a,node b)else if(a.num != b.num)else

}int main()

if(id[0] == 'b')

if(id[0] == 't')

mp[school] += score; //總加權分數

mp2[school]++; //人數+1

cnt++;

} //將map中資料填入vector中

vectorans;

for(map::iterator it = mp.begin(); it != mp.end(); it++));

} sort(ans.begin(),ans.end(),cmp);

int rank = 1;

cout<0 && ans[k].sum != ans[k-1].sum)

printf("%d ",rank);

cout<1032 挖掘機技術哪家強 (20分)

為了用事實說明挖掘機技術到底哪家強,pat 組織了一場挖掘機技能大賽。現請你根據比賽結果統計出技術最強的那個學校。

輸入格式:

輸入在第 1 行給出不超過 10

​5​​ 的正整數 n,即參賽人數。隨後 n 行,每行給出一位參賽者的資訊和成績,包括其所代表的學校的編號(從 1 開始連續編號)、及其比賽成績(百分制),中間以空格分隔。

輸出格式:

在一行中給出總得分最高的學校的編號、及其總分,中間以空格分隔。題目保證答案唯一,沒有並列。

題解思路還是按照map來對映,最後在排序一下。

#include#include#include#include#includeusing namespace std;

struct node;

bool cmp(node a,node b)

int main()

vectorans;

for(map::iterator it = mp.begin(); it != mp.end(); it++));

} sort(ans.begin(),ans.end(),cmp);

cout<1082 射擊比賽 (20分)

本題目給出的射擊比賽的規則非常簡單,誰打的彈洞距離靶心最近,誰就是冠軍;誰差得最遠,誰就是菜鳥。本題給出一系列彈洞的平面座標(x,y),請你編寫程式找出冠軍和菜鳥。我們假設靶心在原點(0,0)。

解題思路:依然可以用map,在排序

#include#include#include#include#include#includeusing namespace std;

struct node;

bool cmp(node a,node b)

vectorans;

for(map::iterator it = mp.begin(); it != mp.end(); it++));

} sort(ans.begin(),ans.end(),cmp);

int last = ans.size()-1;

cout<1081 檢查密碼 (15分)

本題要求你幫助某**的使用者註冊模組寫乙個密碼合法性檢查的小功能。該**要求使用者設定的密碼必須由不少於6個字元組成,並且只能有英文本母、數字和小數點 .,還必須既有字母也有數字。

【說明】這道題開始想用regex,可是我用的編譯器不知處c++11特性。

其次這道題目我開始沒用c提供的ctype庫,直接寫判斷。後來參考其他人部落格,才開始寫了第二版judge()使用isalnum(),isalpha(),isdigt()

#include#include#include#include#include#include#includeusing namespace std;

/* 該**要求使用者設定的密碼必須由不少於6個字元組成,

並且只能有英文本母、數字和小數點 .

還必須既有字母也有數字

*//*

void judge(string s)else if(s[i] >= '0' && s[i] <= '9')else if(s[i] != '.')else if(isalpha(s[i]))else if(isdigit(s[i]))

} if(invalue == 1)

return 0;

}

1079 延遲的回文數 (20分)

給定乙個 k+1 位的正整數 n,寫成 a0​​的形式,其中對所有 i 有 0≤ai<10 且 ak​​ >0。n 被稱為乙個回文數,當且僅當對所有 i 有 ai=ak−i 。零也被定義為乙個回文數。

非回文數也可以通過一系列操作變出回文數。首先將該數字逆轉,再將逆轉數與該數相加,如果和還不是乙個回文數,就重複這個逆轉再相加的操作,直到乙個回文數出現。如果乙個非回文數可以變出回文數,就稱這個數為延遲的回文數。

給定任意乙個正整數,本題要求你找到其變出的那個回文數。

解題思路:1.回文字串的判斷 2.注意測試點4,6使用大整數

第一次直接使用int結果沒過4,6.

#include#include#include#include#include#includeusing namespace std;

/* 延遲的回文數

*/int r_num(int num)

return sum;

}bool ispal(int num)

for(int i = 0; i < cnt / 2; i++)

} return true;

}int main()else

} }return 0;

}

滿分版,使用大整數相加的思路,注意進製標記。

#include#include#include#include#include#includeusing namespace std;

/* 這裡要注意測試點4和6,是用大數測試的

*/bool ispal(string s)

} return true;

}string cal(string a, string b)

str += char(cc + '0');

} if(cx == 1)

reverse(str.begin(),str.end());

return str;

}int main()

for(map::reverse_iterator rit = (mp.rbegin());rit != mp.rend();

rit++) }

return 0;

}

PAT乙級 題目七

大家應該都會玩 錘子剪刀布 的遊戲 現給出兩人的交鋒記錄,請統計雙方的勝 平 負次數,並且給出雙方分別出什麼手勢的勝算最大。我的 include includeusing namespace std 輸出 b c j 中贏得次數最多的那個 int output int num cout 評注 for...

PAT乙級 題目十二

題目 現以科學計數法的格式給出實數a,請編寫程式按普通數字表示法輸出a,並保證所有有效位都被保留 我的 include include include includeusing namespace std int main for int i ppos 1 i epos i zhinum stoi ...

PAT 乙級題目1001

卡拉茲 callatz 猜想 對任何乙個正整數 n,如果它是偶數,那麼把它砍掉一半 如果它是奇數,那麼把 3n 1 砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到 n 1。卡拉茲在 1950 年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果...