[NWPU][2018暑假作业][通用版]二、stl ,模拟,贪心等 [Cloned]

A - stl 的 map

这道题主要还是熟悉map的相关操作……鼓捣了好久才搞明白map是咋回事orz。题目本身很简单。另,我要放弃C投奔C++了…string和cin cout好用。

 

B - stl 的 map

要求是把火星文转换为英文,所以定义map的时候把火星文作为key,英文作为value。用getline()输入,直接对输入的字符串进行判断,如果在map中有对应key值,输出这个key对应的value,如果没有就直接输出。另外判断的时候要区分是不是字母,如果不是字母的话也直接输出。最后getline()不读入最后的回车,所以在测例结束的时候要输出一个回车。

 

C - stl 的 map

要求先按照产地的字母顺序再按照名称的字母顺序输出,还要存储交易的数量。所以定义map的时候把产地作为key,再用一个map作为value,第二个map用名称作为key,交易数量作为value,这样就可以利用map自动进行字符串排序了。最后结束的时候记得要清空map。

 

D - stl 的 map

这题我没用map,没看出来map在哪用……我是直接用物理和数学推导公式的。

输入测例后先判定绳长,如果绳长>=高度的话,直接计算落地速度

v=sqrt(2*9.81*s)

如果v>10,James Bond摔死,否则成功逃脱。

如果绳长<高度,在下落的高度小于等于绳长的时候,还是做自由落体运动,计算下落高度等于绳长时的速度

v0=sqrt(2*9.81*l)

然后假设速度等于0之前已经到达地面,利用牛顿第二定律

G-F=ma

a=dv/dt=(dv/ds)*(ds/dt)=v*(dv/ds)

9.81*w-k*(s-l)=w*v*(dv/ds)

然后直接积分,过程是下落距离等于绳长到落地,即(l, s), (v0, v),推出v的计算公式

v=sqrt((2*(9.81*w+k*l)*(s-l)-k*s*s+k*l*l+w*v0*v0)/w)

令x=2*(9.81*w+k*l)*(s-l)-k*s^2+k*l^2+w*v0^2

v=sqrt(x/w)

再判断x的值,如果x<0,v值不存在(平方根下不能是负数),根据物理意义判断,James Bond停在空中;如果x>=0,计算v值,判断是否大于10,如果v>10,James Bond摔死,否则成功逃脱。

我也不知道这题的用意是不是这样……题解写这么长应该是不对吧……

 

E - 贪心

直接定义一个结构体,里面三个double型变量j,f,v.v=j/f,代表每磅猫食能换的肉的数量,然后对它以v为标准进行降序排序,从v值最大的房间开始换取,每换一次M减少一次,能换到的总和sum增加,当M=0或已经全部换完时,退出循环,输出sum.

 

F - 递推

先考虑直线的情况:每增加一条直线,这条直线和已经存在的直线相交最多于n-1个点,把n块区域分成了两部分,也就是说增加了n块区域。

然后考虑折线:每增加一条折线,相交2*2*(n-1)个点,和直线类似地,增加了4(n-1)+1块区域。

 

G - stl 的 优先队列

吸取教训,以后做题一定按照要求,要求用scanf/printf就绝不用cin/cout。

设立两个优先队列,分别存储最大的n1位和最小的n2位,每输入一个数字存储一次,如果优先队列存储的数字数量大于要求的,就去掉一个。最后用总数减去队列中的数字。因为优先队列每次都是最大的数字出队,所以存储最大的n1位时可以存储它的相反数,这样输入的时候每次pop出来的数的绝对值都是最小的。

 

H - 素数表

map-TE,数组定义在函数内部直接提示越界…… 

找出1000000以内的素数,存在数组中,然后输入K和L判断,注意K可能很大,输入要用字符串。

 

I - Safecracker

暴力循环……

 

J - 归并排序求逆序对

没用归并排序,直接求的逆序数。从前往后遍历,如果遍历到某个字符时前面有大于它的字符出现,那么逆序数就增加所有大于它的字符出现的次数。

 

K - Big Number

只要知道阶乘位数怎么确定就可以了。n!=n*(n-1)*...*1,位数=(int)log10(n!)+1=(int)[log10(1)+log10(2)+...+log10(n)]+1,直接计算即可。

 

L - 卡特兰数

大数乘除。打表,算出100以内整数对应的卡特兰数,直接输出。卡特兰数计算递推公式:h(n)=h(n-1)*(4*n-2)/(n+1);

 

M - Prime Friend

题目要求是找出一个最小的非负整数x,使a+x, b+x为相邻的素数,如果有就输出这个素数,没有就输出-1.依然打表,筛法找出小于2kw的所有素数,然后从最小的素数开始尝试即可。

 

N - A + B Again

刚开始用大数加减法的方法做了半天,写到100+行的时候发现不太对劲……然后突然想到可以用C语言十六进制输入输出……真是傻了……

 

O - Number Sequence

数字n的位数为log10(n)+1,计算出最大数字为n时的字符串长度和他们所在的位置,每次输出的时候查找出来即可。

 

P - 贪心

用一个数组表示这一天是否被使用,然后从分数最大的作业开始,从它的deadline开始往前扫描,如果有一天没有被占用,则标记这一天,表示这个任务在这一天完成。如果没有空闲的日子,则这个任务无法完成。

 

Q - 贪心

按照DPS/HP从高到低排序,相等时HP少的优先击杀。

 

R - 贪心

任务和机器都按照时间降序排序,时间相同则按照等级降序排序。然后从头开始遍历任务,对某个任务先找出机器工作时间大于等于任务时间的所有机器,并按照等级分类,然后从机器等级等于任务等级的机器开始搜索,找出等级最低的工作时间最短的机器完成该任务。由于排序是按照时间降序的,所以每次对大于某个任务时间的机器分类结束之后,不用再清空分类重新分类,因为工作时间一定大于后续任务需要的时间。

 

S - 贪心

这个题和之前的P题思路一模一样……

 

T - 贪心

每周每单位牛奶的成本是本周生产价格和(上周生产价格+仓库存储价格)的最小值,每过一周成本增加一次。

 

U - 贪心

按从大到小排序,每次把没装箱的最大的箱子和最小的箱子配对,如果能装下就装一起,不能的话只装大的。

 

W - stl 的 优先队列

直接定义一个结构体,存储位置d和能扔的距离p,每输入一个就把它放进优先队列(距离越小优先级越大,能扔的距离越小优先级越大)中,输入结束后,每次pop队头,如果是奇数,位置d=d+p,然后再进队,否则不作处理。最后一个石头扔或者不扔之后所在的位置就是距离起点最远的位置。

 

X - 栈

用一个数组保存输出in或者out。用栈来模拟这个过程,一个火车进站之后判断是否和出站的火车相同,如果相同的话这个货车出站。最后如果栈为空说明能符合这个顺序,如果不为空说明不能符合这个顺序。

 

Z - Bitset

定义一个栈,直接短除法,当n=0时从栈顶开始输出直到栈空。

猜你喜欢

转载自blog.csdn.net/qq_40560275/article/details/81046492