题目链接: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;
}
标签:val,格子,队列,Slime,long,int,que,grid,Takahashi
From: https://www.cnblogs.com/benscode/p/18661468