今天上午学习了堆(优先队列),堆分为大根堆和小根堆
可以用STL定义
小根堆: priority_queue< ,vector ,greater >
大根堆: priority_queue< ,vector ,less >
可使用的函数有:
push()放入
top()提取队首元素
pop()出队
size()队中元素个数
下午打比赛
第一题,比较简单,AC
第二题也比较简单,可以直接用栈实现,也AC
第三题用了堆,但答案错了,改了一下也只有三十三
第四题改了以后只有九十,不知道错哪
最后一题,没思路,直接深搜了,但答案不对,提交后竟然蹭了一点分,但没有多大用(就5分真服了这么多样例)
#include<bits/stdc++.h>
using namespace std;
int MIN=9999999;
int dx[4]={1,0,-1,0};
int dy[4]={0,1,0,-1};
int m,n;
int v[105][105];
struct square{
int x;
int y;
int c;
};
square s[1005];
bool g=false;
void dfs(int mp[][105],int x,int y,int money,int C){
if(x==m&&y==m){
g=true;
MIN=min(MIN,money);
return;
}
for(int i=0;i<4;i++){
int tx=x+dx[i];
int ty=y+dy[i];
if(tx>0&&tx<=m&&ty>0&&ty<=m&&v[tx][ty]==0&&!(mp[x][y]==2&&mp[tx][ty]==2)){
int j=-1;
if(C!=mp[tx][ty]){
if(C<2){
if(mp[tx][ty]<2){
C=mp[tx][ty];
j=1;
}else{
j=2;
}
}else{
if(mp[tx][ty]<2){
C=mp[tx][ty];
j=0;
}
}
}else{
j=0;
}
if(j!=-1){
v[tx][ty]=1;
dfs(mp,tx,ty,money+j,C);
v[tx][ty]=0;
}
}
}
return;
}
int main(){
freopen("chess.in","r",stdin);
freopen("chess.out","w",stdout);
int mp[105][105]={2};
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>s[i].x>>s[i].y>>s[i].c;
mp[s[i].x][s[i].y]=s[i].c;
}
v[1][1]=1;
dfs(mp,1,1,0,s[1].c);
if(!g)cout<<-1;
else cout<<MIN;
return 0;
}
服了,66行5分
总体还行吧