Codeforces#388div.2 2017-01-05 practice

A Bachgold Problem

题意:用最多的素数,加出所给数.

题解:用尽可能多的2,如果是偶数,末尾用2,奇数则用3

代码:传送门


B Parallelogram is Back

题意: 平行四边形给三个点找另一个点

题解:肯定有可以找到3个点,水题

代码:传送门


Voting

题意:n个人按所给顺序投票,一些人属于D阵营,一些人属于R阵营,当每个人投票时,他可以选择让某人出局,则这个出局的人失去资格,一轮投票结束后进入下一轮,以此类推,知道某个阵营没人为止,没人的阵营输,现要求判断谁赢

题解:我们只要把两拨人分到两个队列按编号排好,然后按投票顺序筛选,每个人只要把其对立阵营的第一个人票出去就行了,并且当该人投完票后把他放到队尾,以备下一轮使用.

这样到最后哪个队列先空哪个阵营输.

代码:传送门


Leaving Auction

题意:n个人拍卖,给出n次拍卖信息,每个信息由 ai(人的编号) bi(出价)组成,保证ai不等于ai+1,bi

   则,若忽略其中一些人,那么最终由谁获得拍卖品.

   注意,若忽略一些人后,有人连续多次出价(即ai = ai+1),则以其第一次出价为准.

题解:记录每个人的最高出价,和所有出价,则我们忽略一些人后,就要找到出价最高的那个人,以及出价第二高的人的出价,这里,出价最高的那人无需出他所给出的最高价格,只要比第二高的人价格高就行,(因为出价是升序的,所以他出价比第二高人的价格时,后面的出价必定是他一个人的,所以根据规则,按其连续出价的第一次价格计算).

   这里,我们用set来记录一个人的全部出价,这样upper_bound(第二高价格)就是最终价格,但是这里我一开始用的struct数组记录每个人的最高出价并排序,然后对于每次询问,只要continue掉pass的人就行,并且只要从后往前找最高价出价者,和第二高价格,但是这样会T,我估摸着是每个询问都要对struct数组进行遍历复杂度太高.

   既然用到了set,那么还能想到map,可以自动以第一元素按升序排序,符合我们的要求,查询时也不需要遍历,只要通过size就能知道需要的信息.

代码:传送门

你可能感兴趣的:(Codeforces)