E - Takahashi is Slime 2 (优先队列)

题目链接: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< int >,less< int > >)默认大顶堆(int值越大元素优先级越高)

1.que.size()
2.que.push()
3.que.pop()
4.que.top()
5.que.empty()

变成小顶堆-priority_queue<int,vector< int >,greater< int > >que(需要定义类型大于号)

自定义结构类型

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;
}


posted @   Marinaco  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示