記:最近為了準備考研機試所以寫寫pat習題和ccf題目,為了給自己設定乙個進度條,我便想把自己每日做的題目貼上來。一是可以看看自己每天到底學了什麼;而來也分享自己的題解。
如果有錯誤的地方,還請大家指出,非常謝謝!!
1085 pat單位排行 (25分)解題方法1:這種解放我檢視用乙個map存放key=學校,value是人數和加權總分。用到知識點map,vector,pair。 特別注意的是map底層是用紅黑樹實現的,因此它是按照key來排序的。而這裡我們用按照value排序所以我把它存入vector,在排序。可是提交後用乙個bug,便是取整的問題。22分每次 pat 考試結束後,考試中心都會發布乙個考生單位排行榜。本題就請你實現這個功能。
輸入格式:
輸入第一行給出乙個正整數 n(≤10
5 ),即考生人數。隨後 n 行,每行按下列格式給出乙個考生的資訊:
准考證號 得分 學校
其中准考證號是由 6 個字元組成的字串,其首字母表示考試的級別:b代表乙級,a代表甲級,t代表頂級;得分是 [0, 100] 區間內的整數;學校是由不超過 6 個英文本母組成的單位碼(大小寫無關)。注意:題目保證每個考生的准考證號是不同的。
輸出格式:
首先在一行中輸出單位個數。隨後按以下格式非降序輸出單位的排行榜:排名 學校 加權總分 考生人數
其中排名是該單位的排名(從 1 開始);學校是全部按小寫字母輸出的單位碼;加權總分定義為乙級總分/1.5 + 甲級總分 + 頂級總分*1.5的整數部分;考生人數是該屬於單位的考生的總人數。
學校首先按加權總分排行。如有並列,則應對應相同的排名,並按考生人數公升序輸出。如果仍然並列,則按單位碼的字典序輸出。
#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分)解題思路:1.回文字串的判斷 2.注意測試點4,6使用大整數給定乙個 k+1 位的正整數 n,寫成 a0的形式,其中對所有 i 有 0≤ai<10 且 ak >0。n 被稱為乙個回文數,當且僅當對所有 i 有 ai=ak−i 。零也被定義為乙個回文數。
非回文數也可以通過一系列操作變出回文數。首先將該數字逆轉,再將逆轉數與該數相加,如果和還不是乙個回文數,就重複這個逆轉再相加的操作,直到乙個回文數出現。如果乙個非回文數可以變出回文數,就稱這個數為延遲的回文數。
給定任意乙個正整數,本題要求你找到其變出的那個回文數。
第一次直接使用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 年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果...