“科林明伦杯”哈尔滨理工大学第十届程序设计竞赛Part1(BCEFHJ)

太菜了先写写签到题,按做题顺序的

C.面积(签到题)

题意:

求正方形周围接四个半圆的图形的面积。

思路:

推一下公式就可以了。假设正方形边长是x,π为PI。则
化简就是
注意PI=3.14。

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43862364

H.直线(公式+大数)

题意:

n条直线在平面上最多存在多少交点 。

思路:

公式是
其实也很好理解,两条非平行直线有且只有一个交点,其中一条直线与其他直线都有n-1个交点,那么n条直线之间的交点就是n *(n-1).这样的话,每个交点都计算了两次,所以答案要再/2.

因为n的范围是1e15,所有要用大数,也可以用python,JAVA……

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43863149

E.赛马(贪心)

题意:

每匹马都有一个战力值,战力值大的获胜,问小明最多可以赢多少场。

思路:

证明有点麻烦但是不是很难想的贪心思路。

网上有一篇证明很详细的博客,可以参考一下

先说思路:我们肯定是想尽可能的赢得比赛,所以对于对方的战力值小的马,都要尽可能的战胜,不然后面的战力值大的马取胜更加困难。

所以可以设两个指针i,j,分别表示用自己的第i匹马和对方的第j匹马比赛,如果当前这场比赛可以赢的话,就i++,j++,res++;否则,就用自己战斗力更大的马来比,即i++;

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43867206

B.减成1(差分)

题意:

存在n个数,每次操作可以任选一个区间使得区间内的所有数字减一。问最少多少次操作,可以让所有数都变成1。

思路:

做过加强版弱化版的。

用每一个都跟前一个比较,如果后者比前者大的话,就计算进答案。

因为要求最后都变为1,所以可以在输入时就全部-1,这样按照题目的要求就相当于是都变为0.
代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43873512

J.最大值(二分)

题意:

有一个字符串s,对于字符串中一个非前缀子串恰好为字符串的前缀我们称之为ac串。
请问给出一个字符串他的ac串最大长度为多少

思路:

二分最大长度,对于每一个长度,看非前缀的子串里是否有与前缀相等的字符串,如果有,说明该长度符合题意,接下来可以试试更长的;反之,接下来就只能试更短的。

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43875020

F.三角形(思维+斐波那契)

题意:

把一个数分为若干个数,使得从中任意取三个都不能构成三角形,求最多可以分成多少个数。

思路:

按照斐波那契数列来分一定是最优的,斐波那契的前几项为1,1,2,3,5

比如5的话,就可以分为1,1,3。

题意就转化为了找斐波那契的前res项,使得这些项的和<=a;

要注意求和的过程会爆ll,要用ull.

代码:

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=43880755