题目链接:https://atcoder.jp/contests/abc384/tasks/abc384_e
题意:
粘液能够吸收比他严格小x倍的格子,并获得这个格子的力量(同时格子被粘液填充),让你求粘液能达到的最大力量值。
思路:
优先队列priortiy_queue.
每次挑粘液上下左右四个格子入列,由于优先队列维护得到四个格子中最小的那个,所以先吸收该格子的力量值会让以后能吸收更多的格子,让结果更优
(ps:严格小x倍的格子才符合条件,不清楚为什么让 粘液力量值/x*1.0 过不了after_contest数据点,把x乘过去就可以(开__int128(约39位数)防止爆long long))
知识点:
优先队列:数组模拟的一颗完全二叉树
拿出优先级最大的元素(一般是数值最大的)
(priortiy_queue<int,vector
1.que.size()
2.que.push()
3.que.pop()
4.que.top()
5.que.empty()
变成小顶堆-priority_queue<int,vector
自定义结构类型
struct node{
int x;int y;int val;
bool operator<(const node &other)const{
//return val<other.val;(从大到小)
return val>other.val;(从小到大)
}
};
priority_queu<node>que;
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll;
const int inf=INT_MAX;
int dx[]={0,0,-1,1};
struct node{int x;int y;int val;bool operator<(const node &other)const{return val>other.val;}
};
int dy[]={1,-1,0,0};
int h,w;
int p,q;
int grid[505][505];
bool ap[505][505];
int x;
priority_queue<node>qq;
signed main()
{ios::sync_with_stdio(false),cin.tie(0);cin>>h>>w>>x;cin>>p>>q;for(int i=1;i<=h;i++){for(int j=1;j<=w;j++){cin>>grid[i][j];}}int st=grid[p][q];qq.push(node{p,q,grid[p][q]});ap[p][q]=true;int temp=0;while(!qq.empty()){node pos=qq.top();qq.pop();if((__int128)pos.val*x<st){st+=pos.val;}else{if(temp)break;}for(int i=0;i<4;i++){int nx,ny;nx=pos.x+dx[i];ny=pos.y+dy[i];if(nx>=1&&nx<=h&&ny>=1&&ny<=w&&!ap[nx][ny]){qq.push({nx,ny,grid[nx][ny]});ap[nx][ny]=true;}}temp++;}cout<<st;return 0;
}