首页 > 其他分享 >E - Takahashi is Slime 2 (优先队列)

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

时间:2025-01-09 10:43:34浏览次数:1  
标签:val 格子 队列 Slime long int que grid Takahashi

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

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

变成小顶堆-priority_queue<int,vector,greater>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;
}


标签:val,格子,队列,Slime,long,int,que,grid,Takahashi
From: https://www.cnblogs.com/benscode/p/18661468

相关文章

  • 【数据结构与算法】之线性表:栈和队列个人总结
    进度好慢呀!冲冲冲!希望能在17号之前过完一遍数据结构基础!现在也有在做题,但是做题好慢,有的看题解也不理解,......
  • JAVA线程池有哪些队列? 以及它们的适用场景案例
    大家好,我是V哥。在高并发应用场景下,线程池的使用是必然的,那在线程中的队列都有哪些呢?下面V哥整理的几种常见的线程池队列以及适用场景案例,分享给大家。线程池中的队列主要用于存放等待执行的任务,以下是几种常见的线程池队列:1.无界队列(UnboundedQueue)LinkedBlockingQueue......
  • python中的队列
    在Python中,队列(Queue)通常使用collections.deque来实现,因其提供了高效的从两端添加和删除元素的操作。队列通常遵循先进先出(FIFO)的原则,也就是最先插入的元素最先被移除。队列的基本操作:append(x):将元素x加入队列的尾部。popleft():移除并返回队列的头部元素。appen......
  • MQTT和传统消息队列(RabbitMQ,RocketMQ,Kafka)的区别
    适用场景选择哪种协议取决于具体的应用需求。如果需要适用于大量传感器和控制设备之间的通信,且网络环境不稳定或需要节省带宽资源,MQTT是一个不错的选择。而如果需要在浏览器和服务端之间建立实时双向通信,且对实时性和双向交互有较高要求,WebSocket可能更加适合。   产......
  • 【代码随想录】刷题记录(91)-根据身高重建队列
    题目描述:假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i]=[hi,ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。请你重新构造并返回输入数组 people 所表示的队列。返回的......
  • python协程是否可以解决python多进程队列等待的时间消耗
    相关:强化学习:手动实现一个并行环境采样的代码——SynVectorEnv之前写了一个python环境下的多进程仿真环境采样的代码库,后来突发奇想,想到是否可以使用python的协程来解决python多进程同步通信的等待时间消耗,后来写了个Demo的代码,发现没有啥用,准确来说确实有提高,性能提高的又1......
  • 高级java每日一道面试题-2025年01月05日-并发篇-什么是阻塞队列?阻塞队列的实现原理是
    如果有遗漏,评论区告诉我进行补充面试官:什么是阻塞队列?阻塞队列的实现原理是什么?如何使用阻塞队列来实现生产者-消费者模型?我回答:在Java高级面试中,阻塞队列是一个非常重要的概念,它涉及到多线程并发编程的核心知识。以下是对阻塞队列的详细解释,包括其定义、实现原......
  • C# 队列的各种使用方法 private static ConcurrentQueue
            在C#中,ConcurrentQueue<T>是一个线程安全的先进先出(FIFO)集合,它位于System.Collections.Concurrent命名空间中。它非常适合在多线程环境中使用,因为它提供了一些原子操作来确保线程安全。以下是一些常见的ConcurrentQueue<T>使用方法,以ConcurrentQueue<st......
  • python中的队列
    在Python中,队列(Queue)是一种常见的数据结构,特别是在刷算法题时经常被用到。以下是队列相关的基础语法及其在算法题中的应用总结。1.队列的基本定义队列遵循FIFO(先进先出)原则,可以通过以下方式实现:1)collections.dequedeque是双端队列,支持快速的两端插入和删除操作。fro......
  • redis和数据库和消息队列
    NoSQL非关系型的数据库,键值、文档以及图形类型数据存储。天生支持分布式,数据冗余和数据分片等特性,提供可扩展的高可用高性能数据存储。redisRedis优缺点:读写快因为在内存中,只适合小数据量存储和读写因为在内存比磁盘小。Redis单线程很快的原因1、redis是纯内存操作2、采用......