1081. 检查密码 (15) -PAT乙级真题

本题要求你帮助某网站的用户注册模块写一个密码合法性检查的小功能。该网站要求用户设置的密码必须由不少于6个字符组成,并且只能有英文字母、数字和小数点”.”,还必须既有字母也有数字。
输入格式:
输入第一行给出一个正整数 N(<=100),随后 N 行,每行给出一个用户设置的密码,为不超过80个字符的非空字符串,以回车结束。
输出格式:
对每个用户的密码,在一行中输出系统反馈信息,分以下5种:
如果密码合法,输出“Your password is wan mei.”;
如果密码太短,不论合法与否,都输出“Your password is tai duan le.”;
如果密码长度合法,但存在不合法字符,则输出“Your password is tai luan le.”;
如果密码长度合法,但只有字母没有数字,则输出“Your password needs shu zi.”;
如果密码长度合法,但只有数字没有字母,则输出“Your password needs zi mu.”。
输入样例:
5
123s
zheshi.wodepw
1234.5678
WanMei23333
pass*word.6
输出样例:
Your password is tai duan le.
Your password needs shu zi.
Your password needs zi mu.
Your password is wan mei.
Your password is tai luan le.

分析:非空字符串,每个字符串以回车结束,但是字符串里面可能会有空格,所以不能直接用cin,要用getline接收一行字符。在接收完n后要getchar()读取一下换行符才能用getline,否则换行符会被读进getline中~

 

PAT 1142. Maximal Clique (25) – 甲级

A clique is a subset of vertices of an undirected graph such that every two distinct vertices in the clique are adjacent. A maximal clique is a clique that cannot be extended by including one more adjacent vertex. (Quoted from https://en.wikipedia.org/wiki/Clique_(graph_theory))
Now it is your job to judge if a given subset of vertices can form a maximal clique.
Input Specification:
Each input file contains one test case. For each case, the first line gives two positive integers Nv (<= 200), the number of vertices in the graph, and Ne, the number of undirected edges. Then Ne lines follow, each gives a pair of vertices of an edge. The vertices are numbered from 1 to Nv.
After the graph, there is another positive integer M (<= 100). Then M lines of query follow, each first gives a positive number K (<= Nv), then followed by a sequence of K distinct vertices. All the numbers in a line are separated by a space.
Output Specification:
For each of the M queries, print in a line “Yes” if the given subset of vertices can form a maximal clique; or if it is a clique but not a maximal clique, print “Not Maximal”; or if it is not a clique at all, print “Not a Clique”.
Sample Input:
8 10
5 6
7 8
6 4
3 6
4 5
2 3
8 2
2 7
5 3
3 4
6
4 5 4 3 6
3 2 8 7
2 2 3
1 1
3 4 3 6
3 3 2 1
Sample Output:
Yes
Yes
Yes
Yes
Not Maximal
Not a Clique

题目大意:clique是一个点集,在一个无向图中,这个点集中任意两个不同的点之间都是相连的。maximal clique是一个clique,这个clique不可以再加入任何一个新的结点构成新的clique。点编号从1~nv,给出ne条边,以一对结点编号的方式给出。然后给出m条询问,每个询问是一个点集合,问这个点集合是否是maximal clique、是否是clique~
分析:先判断是否是clique,即判断是否任意两边都相连;之后判断是否是maximal,即遍历所有不在集合中的剩余的点,看是否存在一个点满足和集合中所有的结点相连,最后如果都满足,那就输出Yes表示是Maximal clique~

 

PAT 1141. PAT Ranking of Institutions (25) – 甲级

After each PAT, the PAT Center will announce the ranking of institutions based on their students’ performances. Now you are asked to generate the ranklist.
Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (<=105), which is the number of testees. Then N lines follow, each gives the information of a testee in the following format:
ID Score School
where “ID” is a string of 6 characters with the first one representing the test level: “B” stands for the basic level, “A” the advanced level and “T” the top level; “Score” is an integer in [0, 100]; and “School” is the institution code which is a string of no more than 6 English letters (case insensitive). Note: it is guaranteed that “ID” is unique for each testee.
Output Specification:
For each case, first print in a line the total number of institutions. Then output the ranklist of institutions in nondecreasing order of their ranks in the following format:
Rank School TWS Ns
where “Rank” is the rank (start from 1) of the institution; “School” is the institution code (all in lower case); “TWS” is the total weighted score which is defined to be the integer part of “ScoreB/1.5 + ScoreA + ScoreT*1.5”, where “ScoreX” is the total score of the testees belong to this institution on level X; and “Ns” is the total number of testees who belong to this institution.
The institutions are ranked according to their TWS. If there is a tie, the institutions are supposed to have the same rank, and they shall be printed in ascending order of Ns. If there is still a tie, they shall be printed in alphabetical order of their codes.
Sample Input:
10
A57908 85 Au
B57908 54 LanX
A37487 60 au
T28374 67 CMU
T32486 24 hypu
A66734 92 cmu
B76378 71 AU
A47780 45 lanx
A72809 100 pku
A03274 45 hypu
Sample Output:
5
1 cmu 192 2
1 au 192 3
3 pku 100 1
4 hypu 81 2
4 lanx 81 2

题目大意:给出每个学生的id、分数、学校,学校名称不区分大小写,输出学校排名、学校名称、总加权成绩、学校参赛人数。学校名称输出时候以小写方式输出。
分析:两个map,一个cnt用来存储某学校名称对应的参赛人数,另一个sum计算某学校名称对应的总加权成绩。每次学校名称string school都要转化为全小写,将map中所有学校都保存在vector ans中,类型为node,node中包括学校姓名、加权总分、参赛人数。对ans数组排序,根据题目要求写好cmp函数,最后按要求输出。对于排名的处理:设立pres表示前一个学校的加权总分,如果pres和当前学校的加权总分不同,说明rank等于数组下标+1,否则rank不变~
注意:总加权分数取整数部分是要对最后的总和取整数部分,不能每次都直接用int存储,不然会有一个3分测试点不通过~
PS:之前直接使用map,导致在新的PAT系统中提交后最后一个测试点超时,改成了unordered_map即可AC~

PAT 1140. Look-and-say Sequence (20) – 甲级

Look-and-say sequence is a sequence of integers as the following:
D, D1, D111, D113, D11231, D112213111, …
where D is in [0, 9] except 1. The (n+1)st number is a kind of description of the nth number. For example, the 2nd number means that there is one D in the 1st number, and hence it is D1; the 2nd number consists of one D (corresponding to D1) and one 1 (corresponding to 11), therefore the 3rd number is D111; or since the 4th number is D113, it consists of one D, two 1’s, and one 3, so the next number must be D11231. This definition works for D = 1 as well. Now you are supposed to calculate the Nth number in a look-and-say sequence of a given digit D.
Input Specification:
Each input file contains one test case, which gives D (in [0, 9]) and a positive integer N (<=40), separated by a space.
Output Specification:
Print in a line the Nth number in a look-and-say sequence of D.
Sample Input:
1 8
Sample Output:
1123123111
题目大意:给两个数字D和n,第一个序列是D,后一个序列描述前一个序列的所有数字以及这个数字出现的次数,比如D出现了1次,那么第二个序列就是D1,对于第二个序列D1,第三个序列这样描述:D出现1次,1出现1次,所以是D111……以此类推,输出第n个序列~
分析:用string s接收所需变幻的数字,每次遍历s,从当前位置i开始,看后面有多少个与s[i]相同,设j处开始不相同,那么临时字符串 t += s[i] + to_string(j – i);然后再将t赋值给s,cnt只要没达到n次就继续加油循环下一次,最后输出s的值~

LeetCode 322. Coin Change

You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.

Example 1:
coins = [1, 2, 5], amount = 11
return 3 (11 = 5 + 5 + 1)

Example 2:
coins = [2], amount = 3
return -1.

Note:
You may assume that you have an infinite number of each kind of coin.

题目大意:你有一些不同面值的硬币,你需要用这些硬币凑成amount值,计算需要的最少的硬币个数~如果不能凑成,就返回-1

分析:设立dp数组(dp[i]表示凑成i需要的最小硬币个数),一开始dp[0]等于0,i从1到amount填充dp[i]的值,第二层循环遍历coins数组,假设coins[j]作为第一个硬币,那么dp[i-coins[j]]表示剩下的金额需要的硬币个数,此时判断i-coins[j]是否等于-1,也就是是否能够凑成,如果能够凑成,那么当dp[i]>0时表示凑成i需要dp[i]个硬币,这种情况下如果dp[i-coins[j]]+1更小,就更新dp[i],否则就保留dp[i]的值。如果dp[i]本身就<=0说明前面没有方法可以凑成i,那么就直接更新dp[i]为dp[i-coins[j]] + 1的值,有一种凑成的方法总比没有好~最后返回dp[amount]的值表示凑成amount数量需要的最小硬币个数,如果不存在,本身dp数组的初值就为-1,所以也会按照要求返回-1~

 

【C++】max_element() 和 min_element()

0. 在头文件 #include <algorithm> 中,返回的是迭代器,所以输出值的话要在前面加 *

1. 第三个参数cmp可写可不写, max_element() 和 min_element() 默认是从小到大排列,然后 max_element() 输出最后一个值, min_element() 输出第一个值,但是如果自定义的 cmp 函数写的是从大到小排列,那么会导致 max_element() 和 min_element() 的两个结果是对调的

2. 可以用于 vector<int> 或者 vector<string> 等,也可以用于 int arr[4] 或者 string arr[4] ,也可以用于结构体vector或者结构体数组~