NO.1
代码实现:
#include<iostream>
using namespace std;
int n,m;
int main()
{
cin>>n>>m;
long long ret=n;
for(int i=0;i<m-1;i++)
ret=ret*(n-1)%109;
cout<<ret<<endl;
return 0;
}
NO.2
思路:bfs遍历实现,dist用来标记是否走过和记录最小步数。
代码实现:
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
const int N=1010;
char arr[N][N];
int dist[N][N];
int n,m,x1,y1,x2,y2;
int dx[4]={1,-1,0,0};
int dy[4]={0,0,1,-1};
int bfs()
{
if(arr[x2][y2]=='*') return -1;
memset(dist,-1,sizeof dist);
queue<pair<int,int>> q;
q.push({x1,y1});
dist[x1][y1]=0;
while(q.size())
{
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>=1&&x<=n&&y>=0&&y<=m&&arr[x][y]=='.'&&dist[x][y]==-1)
{
q.push({x,y});
dist[x][y]=dist[a][b]+1;
if(x==x2&&y==y2) return dist[x2][y2];
}
}
}
return -1;
}
int main()
{
cin>>n>>m;
cin>>x1>>y1>>x2>>y2;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>arr[i][j];
}
}
cout<<bfs()<<endl;
return 0;
}
NO.3
思路:先按照左端点排序,将第一个的右端点放入队列,将后一个的左端点与之对比,若后一个的左端点大于前一个的右端点说明没有重叠部分,删除前一个右端点,加入该点的右端点,最后返回队列的size。
代码实现:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 计算成功举办活动需要多少名主持人
* @param n int整型 有n个活动
* @param startEnd int整型vector<vector<>> startEnd[i][0]用于表示第i个活动的开始时间,startEnd[i][1]表示第i个活动的结束时间
* @return int整型
*/
int minmumNumberOfHost(int n, vector<vector<int> >& startEnd) {
sort(startEnd.begin(),startEnd.end());
priority_queue<int,vector<int>,greater<int>> heap;
heap.push(startEnd[0][1]);
for(int i=1;i<n;i++)
{
int a=startEnd[i][0],b=startEnd[i][1];
if(a>=heap.top())
{
heap.pop();
heap.push(b);
}
else {
heap.push(b);
}
}
return heap.size();
}
};