HIHOcoder编程总结
[Offer收割]编程练习赛44
对于第一题题目1 : 扫雷游戏,首先要想清楚思路,虽然是暴力算法,但是这八个方向要自己把坐标写正确,不要慌乱,自己写的时候就写错了一个,第二个就是判断的时候,j + 1>=0,这种是显然的事情,应该是j +1 < N,写草稿也要认真。
还有一个非常非常大的错误。
int N = 0; cin >> N; vector<string> input; input.resize(N); for (int i = 0; i < N; ++i) { string tmp; cin >> tmp; input.push_back(tmp); }
前面resize直接导致input有N个空串,后面再压入就会导致有2N个字符串。
第三题:题目3 : 车队
时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 在一条单车道的公路上有N辆汽车行驶,从前向后第i辆车的最高速度是Vi。 所有车辆都会尽量保持最高速度行驶。不过由于只有单车道,所以当后方快车追上前方慢车后,无法超车,只能降速跟在慢车后面。 于是经过足够长时间(足够后方快车追上前方慢车)的行驶后,某些车辆会聚成一队以相同的速度向前行驶。我们把这些聚成一队的车辆称为一个"车队"。不同车队之间的距离会越来越大。 例如假设有5辆车,速度依次是[3, 5, 4, 1, 2],则经过足够长时间行驶后,第1、2、3辆会聚成一个车队,第4、5辆会聚成另一个车队。 现在假设你可以"拿掉"其中一些车辆,但不能改变剩余的车辆的前后次序和最高速度。请计算最少"拿掉"多少辆车,可以使得剩余的车辆数目恰好等于剩余车辆经过足够长时间行驶后形成的车队数量。(换句话说每辆车单独一个车队) 在上例中"拿掉"第一辆和第四辆之后,[5, 4, 2]会最终形成3个车队,满足条件。 输入 第一行包含一个整数N。 第二行包含N个整数V1, V2, ... VN。 对于30%的数据,1 ≤ N ≤ 1000 对于100%的数据,1 ≤ N ≤ 100000, 1 ≤ Vi ≤ 100000, Vi保证两两不同。 输出 一个整数表示答案。 样例输入 5 3 5 4 1 2 样例输出 2
这题是一个最长上升子序列问题。开始自己马上不想就认为找到最长上升子序列和最长下降子序列就可以了,首先需要理解题目意思,应该是最后的答案是一个最长递降子序列,所以需要将vector进行反转,然后在进行求解最长递增子序列。