【今日三题】kotori和气球(排列) / 走迷宫(BFS最短路) / 主持人调度(二)(贪心+优先级队列)

目录
- kotori和气球(排列)
- 走迷宫(BFS最短路)
- 主持人调度(二)(贪心+优先级队列)
kotori和气球(排列)
- kotori和气球
我是🤡,这题没做出来。
m个位置放n种气球,第一个位置有n种情况,之后的位置只需要和前一个不是相同种类就行,因此后面都有n-1种情况。
#include <iostream>
using namespace std;const int mod = 109;
int n, m, res;int main()
{cin >> n >> m;res = n;for (int i = 1; i < m; i++){res = res * (n - 1) % mod;}cout << res << endl;return 0;
}
走迷宫(BFS最短路)
- 走迷宫
#include <iostream>
#include <vector>
#include <queue>
using namespace std;int dx[4] = {1, -1, 0, 0}, dy[4] = {0, 0, 1, -1};
bool used[1001][1001];
using pii = pair<int, int>;
queue<pii> q;
int n, m, step, flag;
int xs, ys, xt, yt;int main()
{cin >> n >> m;cin >> xs >> ys >> xt >> yt;vector<string> vs(n + 1);for (int i = 1; i <= n; i++){string s;cin >> s;vs[i] = " " + s;}if (vs[xt][yt] == '.') {q.push({xs, ys});used[xs][ys] = true;while (q.size()){step++;int sz = q.size();while (sz--){auto [a, b] = q.front();q.pop();for (int i = 0; i < 4; i++){int x = a + dx[i], y = b + dy[i];if (x == xt && y == yt){flag = 1;break;}if (x > 0 && x <= n && y > 0 && y <= m && !used[x][y] && vs[x][y] == '.'){used[x][y] = true;q.push({x, y});}}if (flag) break;}if (flag) break;}}cout << (step > 0 ? step : -1) << endl;return 0;
}
主持人调度(二)(贪心+优先级队列)
- 主持人调度(二)
首先对二维数组按左端点排升序,如果某个区间的左端点 >= 当前区级右端点,则这两个区间就可以由一个主持人主持,否则就需要多加一个主持人。
我们把所有主持人主持的区间右端点用小堆维护起来,遍历到当前区间,用当前区间左端点和维护起来的所有区间右端点中最小的比较,如果比这个最小的还小,则必须要多加一个主持人;否则不需要多加,然后把最小的右端点删除,将当前区间右端点入堆。
class Solution {
public:int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {priority_queue<int, vector<int>, greater<int>> pq;sort(startEnd.begin(), startEnd.end());pq.push(startEnd[0][1]);for (int i = 1; i < n; i++){if (startEnd[i][0] >= pq.top()) pq.pop();pq.push(startEnd[i][1]);}return pq.size();}
};
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~
