拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:

  • 每排人数为N/K(向下取整),多出来的人全部站在最后一排;
  • 后排所有人的个子都不比前排任何人矮;
  • 每排中最高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);
  • 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);
  • 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

现给定一组拍照人,请编写程序输出他们的队形。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出两个正整数N(<=10000,总人数)和K(<=10,总排数)。随后N行,每行给出一个人的名字(不包含空格、长度不超过8个英文字母)和身高([30, 300]区间内的整数)。

输出格式:

输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

输入样例:

输出样例:

PAT-A-1109-Group Photo 的中文版。

代码如下:

继续阅读

本题的基本要求非常简单:给定N个实数,计算它们的平均值。但复杂的是有些输入数据可能是非法的。一个“合法”的输入是[-1000,1000]区间内的实数,并且最多精确到小数点后2位。当你计算平均值的时候,不能把那些非法的数据算在内。

输入格式:

输入第一行给出正整数N(<=100)。随后一行给出N个正整数,数字间以一个空格分隔。

输出格式:

对每个非法输入,在一行中输出“ERROR: X is not a legal number”,其中X是输入。最后在一行中输出结果:“The average of K numbers is Y”,其中K是合法输入的个数,Y是它们的平均值,精确到小数点后2位。如果平均值无法计算,则用“Undefined”替换Y。如果K为1,则输出“The average of 1 number is Y”。

输入样例1:

输出样例1:

输入样例2:

输出样例2:

PAT-A-1108. FINDING AVERAGE 的中文版

这道题需要注意的是最多精确到 2 位,同时只有 0 个或 1 个合法数字时的输出。(似乎和测试点 3 有关

In case the average cannot be calculated, output “Undefined” instead of Y. In case K is only 1, output “The average of 1 number is Y” instead.

其他的就没有什么问题,就是发现自己的思路好不清晰,写第一遍时没有 AC ,然后偷懒直接 sscanf 反而过了……

本来打算写一个基于正则表达式的,但不知 regex.h 能不能用,回来有空尝试一下。

代码如下:

继续阅读

在不打扰居民的前提下,统计住房空置率的一种方法是根据每户用电量的连续变化规律进行判断。判断方法如下:

  • 在观察期内,若存在超过一半的日子用电量低于某给定的阈值e,则该住房为“可能空置”;
  • 若观察期超过某给定阈值D天,且满足上一个条件,则该住房为“空置”。

现给定某居民区的住户用电量数据,请你统计“可能空置”的比率和“空置”比率,即以上两种状态的住房占居民区住房总套数的百分比。

输入格式:

输入第一行给出正整数N(<=1000),为居民区住房总套数;正实数e,即低电量阈值;正整数D,即观察期阈值。随后N行,每行按以下格式给出一套住房的用电量数据:

K E1 E2 … EK

其中K为观察的天数,Ei为第i天的用电量。

输出格式:

在一行中输出“可能空置”的比率和“空置”比率的百分比值,其间以一个空格分隔,保留小数点后1位。

输入样例:

输出样例:

(样例解释:第2、3户为“可能空置”,第4户为“空置”,其他户不是空置。)

水题一道,“可能空置”与“空置”互斥,看题时没注意到……看数据才发现。

代码如下:

继续阅读

萌萌哒表情符号通常由“手”、“眼”、“口”三个主要部分组成。简单起见,我们假设一个表情符号是按下列格式输出的:

现给出可选用的符号集合,请你按用户的要求输出表情。

输入格式:

输入首先在前三行顺序对应给出手、眼、口的可选符号集。每个符号括在一对方括号[]内。题目保证每个集合都至少有一个符号,并不超过10个符号;每个符号包含1到4个非空字符。

之后一行给出一个正整数K,为用户请求的个数。随后K行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从1开始),数字间以空格分隔。

输出格式:

对每个用户请求,在一行中输出生成的表情。若用户选择的序号不存在,则输出“Are you kidding me? @\/@”。

输入样例:

输出样例:

这道题,也有坑……

之后一行给出一个正整数K,为用户请求的个数。随后K行,每行给出一个用户的符号选择,顺序为左手、左眼、口、右眼、右手——这里只给出符号在相应集合中的序号(从1开始),数字间以空格分隔。

从 1 开始,但是测试数据被没有被限制在该范围内,所以应过滤输入,第 1 2 测试点就针对是这种情况吧。

代码如下:

继续阅读

复数可以写成(A + Bi)的常规形式,其中A是实部,B是虚部,i是虚数单位,满足i2 = -1;也可以写成极坐标下的指数形式(R*e(Pi)),其中R是复数模,P是辐角,i是虚数单位,其等价于三角形式(R(cos(P) + isin(P))。

现给定两个复数的R和P,要求输出两数乘积的常规形式。

输入格式:

输入在一行中依次给出两个复数的R1, P1, R2, P2,数字间以空格分隔。

输出格式:

在一行中按照“A+Bi”的格式输出两数乘积的常规形式,实部和虚部均保留2位小数。注意:如果B是负数,则应该写成“A-|B|i”的形式。

输入样例:

输出样例:

神坑 PAT,明明只是 Basic 级别中只有15分的题,通过率却只有 0.05,

我也贡献了十几次……过不了都怪我读题不认真T_T

没有比 Basic 级别的题目更言简意赅,简单明快的题目了,基本看一眼就可以写了,但是……但是……但是……谁知道会有这种坑。

坑主要就是在 -0.00 的问题之上了。

第一遍提交没过,考虑到实数的精度,于是使用了 float.h 中的 DBL_EPSILON 来提升精度。

……

……

……

……

……

然后我改了十几次,都没过……

后来随便输了一组数据……突然发现 -0.001 也会被过滤成 -0.00 ……当时就想打死自己……竟然会如此疏忽……

代码如下:

继续阅读

本题要求将给定的N个正整数按非递增的顺序,填入“螺旋矩阵”。所谓“螺旋矩阵”,是指从左上角第1个格子开始,按顺时针螺旋方向填充。要求矩阵的规模为m行n列,满足条件:m*n等于N;m>=n;且m-n取所有可能值中的最小值。

输入格式:

输入在第1行中给出一个正整数N,第2行给出N个待填充的正整数。所有数字不超过104,相邻数字以空格分隔。

输出格式:

输出螺旋矩阵。每行n个数字,共m行。相邻数字以1个空格分隔,行末不得有多余空格。

输入样例:

输出样例:

尽管是一道25分的题,但是还算是比较简单的,一开始没想到这种相对简单的方法,打算通过一个变量level来控制螺旋的层数,实现顺时针螺旋遍历。

但是觉得这样太麻烦,刚打完这个变量名就想起了上学期C专题写的迷宫程序,当时用DFS生成迷宫时将 srand(time(NULL)) 放到了循环体内,就生成了一个螺旋的路线XD

于是,便又一次使用了类似于遍历迷宫的方法实现了这个矩阵的遍历。

代码如下:

继续阅读

给定一个正数数列,我们可以从中截取任意的连续的几个数,称为片段。例如,给定数列{0.1, 0.2, 0.3, 0.4},我们有(0.1) (0.1, 0.2) (0.1, 0.2, 0.3) (0.1, 0.2, 0.3, 0.4) (0.2) (0.2, 0.3) (0.2, 0.3, 0.4) (0.3) (0.3, 0.4) (0.4) 这10个片段。

给定正整数数列,求出全部片段包含的所有的数之和。如本例中10个片段总和是0.1 + 0.3 + 0.6 + 1.0 + 0.2 + 0.5 + 0.9 + 0.3 + 0.7 + 0.4 = 5.0。

输入格式:

输入第一行给出一个不超过105的正整数N,表示数列中数的个数,第二行给出N个不超过1.0的正数,是数列中的数,其间以空格分隔。

输出格式:

在一行中输出该序列所有片段包含的数之和,精确到小数点后2位。

输入样例:

输出样例:

这道题尽管看起来非常简单,但是……似乎在精度上有坑?

如果使用纯循环来求解的话测试点2和3会超时,但是求和的公式还是很容易归纳出的。

sum = (n-i)*(i+1)*Ai (i from 0 to n-1)

在我最初写的代码中,测试点2和3一直不过,考虑到可能是精度的问题,打算写一个高精度小数的运算来过这道题,但是最近比较忙也比较懒,一直没去实现。再加上这道题应该不会那么坑,今晚突然想到或许是系数的类型而导致的精度问题,将倍数 (n-i) 和 (i+1) 均强制类型转换为 double 类型时,通过了。

代码如下:

继续阅读

本题要求实现一种数字加密方法。首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:对奇数位,对应位的数字相加后对13取余——这里用J代表10、Q代表11、K代表12;对偶数位,用B的数字减去A的数字,若结果为负数,则再加10。这里令个位为第1位。

输入格式:

输入在一行中依次给出A和B,均为不超过100位的正整数,其间以空格分隔。

输出格式:

在一行中输出加密后的结果。

输入样例:

输出样例:

题目有坑,暂时还没跳出来(⊙﹏⊙)

已解决,待有空时更新……

虚拟主机竟然被D了14个多小时……

顺便补充了一个不用反转字符串的版本。


 

我考虑了输入和输出可能存在的坑,但是没有想到,当B的长度小于A的长度时,需要在B前补零以完成加密,那么这道题就存在误导性了。

原题中提到

首先固定一个加密用正整数A,对任一正整数B,将其每1位数字与A的对应位置上的数字进行以下运算:

没错,是针对B的每位数字,B本身前面没有零。

差评!(我不会说这道题我提交了30+次,无果后Google一下才发现会是这么个情况/(ㄒoㄒ)/~~

另外,当A的长度小于B的长度,剩余部分可以不做处理或者对A前补零(两者并没有什么区别)。

代码如下:

继续阅读

编程团体赛的规则为:每个参赛队由若干队员组成;所有队员独立比赛;参赛队的成绩为所有队员的成绩和;成绩最高的队获胜。

现给定所有队员的比赛成绩,请你编写程序找出冠军队。

输入格式:

输入第一行给出一个正整数N(<=10000),即所有参赛队员总数。随后N行,每行给出一位队员的成绩,格式为:“队伍编号-队员编号 成绩”,其中“队伍编号”为1到1000的正整数,“队员编号”为1到10的正整数,“成绩”为0到100的整数。

输出格式:

在一行中输出冠军队的编号和总成绩,其间以一个空格分隔。注意:题目保证冠军队是唯一的。

输入样例:

输出样例:

依旧是很简单的一道题,毕竟是PAT-Basic的题目。

代码如下:

继续阅读

划拳是古老中国酒文化的一个有趣的组成部分。酒桌上两人划拳的方法为:每人口中喊出一个数字,同时用手比划出一个数字。如果谁比划出的数字正好等于两人喊出的数字之和,谁就赢了,输家罚一杯酒。两人同赢或两人同输则继续下一轮,直到唯一的赢家出现。

下面给出甲、乙两人的划拳记录,请你统计他们最后分别喝了多少杯酒。

输入格式:

输入第一行先给出一个正整数N(<=100),随后N行,每行给出一轮划拳的记录,格式为:

甲喊 甲划 乙喊 乙划

其中“喊”是喊出的数字,“划”是划出的数字,均为不超过100的正整数(两只手一起划)。

输出格式:

在一行中先后输出甲、乙两人喝酒的杯数,其间以一个空格分隔。

输入样例:

输出样例:

15分的题依旧可以在一分钟内解决。

代码如下:

继续阅读