笔试——Day45
文章目录
- 第一题
- 题目
- 思路
- 代码
- 第二题
- 题目
- 思路
- 代码
- 第三题
- 题目
- 思路
- 代码
第一题
题目
kanan和高音
思路
双指针遍历数组,更新左右端点并计算最大值
代码
#include<iostream>
#include<vector>
using namespace std;int main()
{int n; cin >> n;vector<int> a(n);for(int i = 0; i < n; i++) cin >> a[i];int res = 1;for(int i = 0; i < n;){int j = i;while(j + 1 < n && a[j + 1] - a[j] <= 8) j++;res = max(res, j - i + 1);i = j + 1;}cout << res << endl;return 0;
}
第二题
题目
拜访
思路
单源最短路: 额外利用一个
cnt
数组维护到当前位置的方法数
代码
// https://www.nowcoder.com/practice/491828fc7d93459db450b344c2aaaeef?tpId=128&tqId=33770&ru=/exam/oj
#include<iostream>
#include<vector>
#include<queue>using namespace std;class Solution {int n, m;int x1, y1, x2, y2;int dist[11][11];int cnt[11][11];int dx[4] = {1, -1, 0, 0};int dy[4] = {0, 0, 1, -1};
public:/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param CityMap int整型vector<vector<>> * @param n int整型 * @param m int整型 * @return int整型*/int countPath(vector<vector<int> >& CityMap, int _n, int _m) {// write code heren = _n, m = _m;for(int i = 0; i < n; i++){for(int j = 0; j < m; j++){if(CityMap[i][j] == 2){x1 = i, y1 = j; // 起点}if(CityMap[i][j] == 1){x2 = i, y2 = j; // 终点}}}return bfs(CityMap);}int bfs(vector<vector<int> >& CityMap){memset(dist, -1, sizeof(dist));queue<pair<int, int>> q;q.push({x1, y1});dist[x1][y1] = 0;cnt[x1][y1] = 1;while(q.size()){auto [a, b] = q.front(); q.pop();for(int i = 0; i < 4; i++){int x = a + dx[i];int y = b + dy[i];if(x >= 0 && x < n && y >= 0 && y < m && CityMap[x][y] != -1){if(dist[x][y] == -1){dist[x][y] = dist[a][b] + 1;cnt[x][y] = cnt[a][b];q.push({x, y});}else if(dist[x][y] == dist[a][b] + 1){cnt[x][y] = (cnt[x][y] + cnt[a][b]);}}}}return cnt[x2][y2];}
};
第三题
题目
买卖股票的最好时机(四)
思路
动态规划
-
状态表示:
f[i][j]
第i
天结束后操作了j
次,手里有股票;g[i][j]
第i
天结束后操作了j
次,手里没有股票;
-
状态转移方程:
- 对于
f[i][j]
:- 前一天手里有股票,交易了
j
次,第i
天什么也不干,此时f[i][j] = f[i - 1][j]
- 前一天手里没股票,交易了
j
次,第i
天买入股票,此时f[i][j] = g[i - 1][j] - price[i]
- 前一天手里有股票,交易了
- 对于
g[i][j]
:- 前一天手里有股票,交易了
j - 1
次,第i
天卖出股票,此时g[i][j] = f[i - 1][j - 1] + price[i]
- 前一天手里没股票,交易了
j
次,第i
天什么也不干,此时g[i][j] = g[i - 1][j]
- 前一天手里有股票,交易了
- 对于
-
初始化:由于需要⽤到
i = 0
时的状态,因此我们初始化第⼀⾏即可- 第
0
天时,买⼊过⼀次,f[0][0] = - prices[0]
- 第
-
填表顺序:从上往下填每⼀⾏,每⼀⾏从左往右,两个表⼀起填
-
返回值:返回处于卖出状态的最⼤值,但是我们也不知道是交易了⼏次,因此返回
g
表最后⼀⾏的最⼤值
代码
#include <cstring>
#include <iostream>
using namespace std;const int N = 1010, M = 110;
int n, k, p[N];
int f[N][M], g[N][M];int main()
{cin >> n >> k;for(int i = 0; i < n; i++) cin >> p[i];memset(f, -0x3f3f3f3f, sizeof f);memset(g, -0x3f3f3f3f, sizeof g);k = min(k, n / 2);f[0][0] = -p[0];g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j <= k; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i]);g[i][j] = g[i - 1][j];if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i]);}}int ret = 0;for(int j = 0; j <= k; j++) ret = max(ret, g[n - 1][j]);cout << ret << endl;return 0;
}
// 64 位输出请用 printf("%lld")