
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();
}
};
本篇文章的分享就到这里了,如果您觉得在本文有所收获,还请留下您的三连支持哦~
