洛谷 P4829 kry loves 2048——题解

news/2024/9/19 4:59:21/文章来源:https://www.cnblogs.com/qc0817/p/18402024

洛谷P4829题解


传送锚点


摸鱼环节

kry loves 2048

题目背景

kls是一个人赢。

题目描述

kls最近在玩一款类似2048的游戏,规则是这样的:

一开始,有\(n\)个方块,每个方块上有一个\(1\)\(m\)的整数。

kls可以进行两种操作:

  1. 选择两个数字相同的方块(不一定要相邻),将它们合并成一个数字为原来的两倍的方块;

  2. 减小一个方块上的数字。

操作的次数没有限制,最终的得分为所有方块上的最大的数字。

因为kls要去陪妹子了,没有时间继续玩,他想让你帮忙计算一下,最多能得到多少分。

输入格式

因为数据可能很大,读入容易超时,所以kls给你们提供了一个c++的随机数生成器。

void generate_array(int a[], int n, int m, int seed) {unsigned x = seed;for (int i = 0; i < n; ++i) {x ^= x << 13;x ^= x >> 17;x ^= x << 5;a[i] = x % m + 1;}
}

把这个函数复制到你的程序里。用一个足够大的数组,以及输入数据给出的\(n\)\(m\)\(seed\)作为参数,调用这个函数。然后这个数组里就是一开始的方块上的数字(下标从0开始)。

输入一行三个数\(n,m,seed\),含义如上。

输出格式

一行一个数,表示最大得分。

样例 #1

样例输入 #1

5 10 233

样例输出 #1

24

样例 #2

样例输入 #2

5 50 3

样例输出 #2

48

样例 #3

样例输入 #3

1000 1000 666

样例输出 #3

374784

提示

样例解释

样例1生成出来的数是 6 10 7 5 4。

样例2生成出来的数是 8 12 48 4 4。

数据范围

对于30%的数据,\(n, m \le 10\)

对于60%的数据,\(n, m \le 10^5\)

对于100%的数据,\(n, m \le 10^7\)\(1 \le seed \le 10^9\)


众所周知,oier们喜欢处理一些奇奇怪怪非常有意思的问题。同时,oier们都乐于助人,每天都在帮不同的人处理不同的问题(我cow,今天这个人怎么还有妹子可以陪),面对kls的困难之处,咱们oier酸了当然得帮他解决。所以,正解是帮他陪妹子。


正片开始

1.草率代码

类似于合并果子,每次应该选取小于数\(a\)
中的最大值进行合并,考虑用优先队列维护。

code:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e7+5;
ll n,m,seed,ans;
ll a[N];
priority_queue<ll,vector<ll>,greater<ll> > q;//小数在前
void cao(ll n, ll m, ll seed) //n个数,m域 
{unsigned x=seed;for(ll i=0;i<n;++i) {x^=x<<13;x^=x>>17;x^=x<<5;a[i]=x%m+1;}
}
int main()
{cin>>n>>m>>seed;cao(n,m,seed);for(int i=0;i<=n;i++) q.push(a[i]);while(q.size()>1){ll x=q.top(),y,z;q.pop();y=q.top();q.pop();z=2*x;ans=max(ans,max(x,y));//更新当前答案q.push(max(z,y));//比较是选择较小数*2更优,还是较大数更优。}ans=max(ans,q.top());cout<<ans;return 0;
}

然后突然发现,代码TLE,还T了4个点,看着黄色的60,内心万分不甘,于是打开题解区认真分析下复杂度。发现代码的复杂度为\(nlogn\)\(n=1e7\)显然是祭得很惨。

2.优化环节

很明显这个\(logn\)肯定是得去掉的,由于在排序上的复杂度不够优,所以选择用计数排序预处理解决问题,这样复杂度就降到了\(o(n)\),于是快乐AC了。

code:

for(int i=mina;i<=maxa;i++)for(int j=1;j<=t[i];j++)a[++len]=i;

完整代码

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e7+5;
int n,m,seed,b[N],a[N],t[N];
ll maxa=0,mina=0x3f;
ll len=0,cnt=1;
queue<ll>q;
void cao(int n, int m, int seed) 
{unsigned x=seed;for(int i=1;i<=n;++i) {x^=x<<13;x^=x>>17;x^=x<<5;b[i]=x%m+1;}
}
ll get()
{if(q.empty()) return a[cnt++];ll x=q.front();if(cnt==n+1||a[cnt]>x){q.pop();return x;}return a[cnt++];}
int main()
{cin>>n>>m>>seed;cao(n,m,seed);for(int i=1;i<=n;i++){t[b[i]]++;maxa=max(maxa,1ll*b[i]);mina=min(mina,1ll*b[i]);}for(int i=mina;i<=maxa;i++)for(int j=1;j<=t[i];j++)a[++len]=i;//计数排序for(int i=1;i<n;i++){ll x=get(),y=get();q.push(max(x*2,y));}cout<<q.front()<<endl;return 0;
}

完结收工!!!!!

个人主页

看完点赞,养成习惯

\(\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\Downarrow\)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/793710.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

代码整洁之道--读书笔记(4)

代码整洁之道简介: 本书是编程大师“Bob 大叔”40余年编程生涯的心得体会的总结,讲解要成为真正专业的程序员需要具备什么样的态度,需要遵循什么样的原则,需要采取什么样的行动。作者以自己以及身边的同事走过的弯路、犯过的错误为例,意在为后来者引路,助其职业生涯迈上更…

Javaweb-DQL-分页查询

1. select * from stu limit 0,3; 2. select * from stu limit 0,3; 3. select * from stu limit 3,3; 4. select * from stu limit 6,3;

有哪些让你「 爽到爆炸 」的 Windows 软件?

前言 本文源于知乎的一个提问,如标题所示:有哪些让你「 爽到爆炸 」的 Windows 软件?今天大姚给大家分享6款C#/.NET开源且免费的Windows软件,希望可以帮助大家提高学习、开发、办公效率。 Microsoft PowerToys项目简介: Microsoft PowerToys 是使用 C++ 和 C# 编程语言开发…

LeetCode刷题 堆

不会做简单题目的小菜菜!一:堆 1、一种二叉树的结构(完全二叉树) 2、完全二叉树:从上到下;从左到右;填满 3、最大堆:根节点的权值大于孩子节点 4、最小堆:根节点的权值依次小于孩子节点 5、常用操作 #创建堆(最大堆,最小堆) #添加元素 #获取堆顶元素 #删除堆顶元素…

单双链表

AcWing 826. 单链表 模板题: 实现一个单链表,链表初始为空,支持三种操作:向链表头插入一个数; 删除第 k 个插入的数后面的一个数; 在第 k 个插入的数后插入一个数。现在要对该链表进行 M 次操作,进行完所有操作后,从头到尾输出整个链表。 注意:题目中第 k 个插入的数并…

20221413杜佳妍《密码系统设计》第一周

第一周预习报告 学习内容《Windows C/C++加密解密实战》第 1,2 章第一章概念复习第二章主要在 Linux(Ubuntu,openEuler)上把软件更新到最新版(3.0版本以上)AI 对学习内容的总结(1分) 要求让AI阅读学习内容并进行总结总结第一章概念复习 1. 基本概念密码学:一门研究信息系…

信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查找、二分比较、循环结构、图领奖

信息学奥赛初赛天天练-85-NOIP2014普及组-基础题4-链表、随机存取、顺序存取、二分查找、二分比较、循环结构、图领奖 PDF文档公众号回复关键字:202409071 NOIP 2014 普及组 基础题4 9 下列选项中不属于图像格式的是( ) A JPEG 格式 B TXT 格式 C GIF 格式 D PNG 格式 10…

【笔记】【THM】Phishing(网络钓鱼)(这个模块还没学完)

钓鱼佬永不空军!!! (请不要违反法律进行网络钓鱼)【笔记】【THM】Phishing(网络钓鱼) 了解如何分析和防御网络钓鱼电子邮件。使用各种技术调查现实世界的网络钓鱼尝试。 在本模块中,您将学习如何动手分析各种网络钓鱼攻击。从检查电子邮件的源属性到查看恶意网络钓鱼附…

Kafka原理剖析之「Topic创建」

一、前言 Kafka提供了高性能的读写,而这些读写操作均是操作在Topic上的,Topic的创建就尤为关键,其中涉及分区分配策略、状态流转等,而Topic的新建语句非常简单 bash kafka-topics.sh \ --bootstrap-server localhost:9092 \ // 需要写入endpoints --create --topic topicA …

SpringBoot集成WebSocket实现后端向前端推送数据

SpringBoot集成WebSocket实现后端向前端推送数据 这里最好了解一定 websocket 参考地址:https://developer.mozilla.org/zh-CN/docs/Web/API/WebSockets_API/Writing_WebSocket_client_applications在此之前可以了解一下【轮询(Polling)、长轮询(Long Polling)、服务器发送…

扫码获取微信公众号用户的openid,向某个用户推送消息

1. 生成二维码: 生成二维码比较简单的方法是直接使用phpqrcode程序包(可在网上下载得到)。 若想获得ThinkPHP支持,需将程序包放在ThinkPHP/Extend/Vendor目录下,让后在程序中引用,代码如下: vendor("phpqrcode.phpqrcode"); //要生成二维码的数据 $text="…

京东h5st参数js逆向

扣代码的环节挺简单的就不讲了 直接到重点 发现许多包都会有一个h5st的加密参数 那么我们就要看这个参数是怎么生成的我们可以根据请求堆栈 找到h5st的入口 当然还有一种更简单的方法 就是直接全局搜索h5st 这里采用后者这里sign函数就是h5st生成的地方 但是这是个promise异步函…