首页 > 编程语言 >洛谷P7792 KRIZA 题解 C++

洛谷P7792 KRIZA 题解 C++

时间:2023-01-12 22:56:10浏览次数:64  
标签:尝试 洛谷 int 题解 P7792 long 次数 钥匙 扇门

洛谷P7792 KRIZA 题解 C++

题目概述:


题目传送门

Sisyphus 在一个圆形的房间里,房间内有 n 扇锁着的门,他有 n 把钥匙,其中第 i 把钥匙对应第 $v_i$ 扇门,遇到不匹配的钥匙就放到钥匙扣的另一边。他需要解锁所有的门。Sisyphus 沿着门编号顺序,每次到一扇门前就找到第 i 把钥匙尝试打开门,直到找到正确的钥匙,然后把门再锁上,一直到他第 k 次成功解锁为止。

数据范围:

  • 对于 40% 的数据,1 ⩽ n , k ⩽ 10^3。

  • 对于 \(60\%\) 的数据,\(1 ⩽ n , k ⩽ 5 \times 10^4\)。

  • 对于 \(100\%\) 的数据,\(1 ⩽ n , k ⩽ 5 \times 10^4\)。

思路:

看到此题,第一反应肯定是暴力,模拟到每一扇门前尝试每一把钥匙,这样的时间复杂度为 $O(nk)$,肯定过不了,提交只有 $24pts$。

这时候我们可以想想优化。

我们只需要集中一下注意力,不难发现,对于尝试每一圈的 \(n\) 扇门,其实这是一个循环的过程,所以我们只需要遍历一圈即可。

我们可以用 \(a_i\) 表示从第 \(1\) 扇门到第 \(i-1\) 扇门尝试的次数 (是不是有点像前缀和?),然后我们维护 \(p\) 表示当前已经选到的钥匙编号,然后从 \(2\) 到 \(n+1\) 遍历,对于每一扇门,更新 \(p\) 和 \(a_i\) 的值,最后可以计算出试完第 \(k\) 扇门的尝试次数,即:

  • \(a[n]×(k ÷ n)+a[k\mod n]\)

这是什么意思?很好理解,我们已经计算出了每圈的尝试次数,我们用次数乘上圈数就是整圈的尝试次数,然后我们再加上剩余不足一圈的尝试次数,就是答案了。

可能还有人要问:为什么是从 $2$ 到 $n+1$ 遍历?

这也很好理解,因为 $a_i$ 表示的是从第 $1$ 扇门到第 $i-1$ 扇门尝试的次数。对于第 $i-1$ 扇门,从第 $1$ 扇门到这扇门的尝试次数等于上一次的尝试次数加上这一次的尝试次数。

Tips:注意两个坑:

  1. 下一扇门的钥匙编号可能到下一圈,更新时要判断。

  2. k 一定要减一,因为有 \(k\mod n = 0\) 的情况,最后可能会多算。

  3. 为了方便处理,本蒟蒻把输入的 \(v_i\) 改成了表示第 i 扇门的钥匙编号。

\(Code\)

#include<bits/stdc++.h>
using namespace std;
long long v[100001],a[100001];
int n,k;
int p,sum;
long long ans=0;//保险起见,开个long long
int main()
{
	cin>>n>>k;
	k--;
	for(int i=1;i<=n;i++) 
	{
	int x;
	cin>>x;
	v[x]=i;
	}//输入不用说
	ans=v[1]-1;//这句很重要:ans的初始值
	p=v[1];//p从1开始
	v[n+1]=v[1];//第n+1扇门就是第1扇门
	for(int i=2;i&lt;=n+1;i++)
	{
	if(v[i]>=p)a[i-1]=a[i-2]+v[i]-p;
	//钥匙的编号和当前的钥匙编号在一圈内:更新a数组:上一扇门加上这扇门需要尝试的次数
	else a[i-1]=a[i-2]+v[i]+n-p;
	//否则在下一圈
	p=v[i];//更新p
	}
	ans+=a[n]*(k/n)+a[k%n];//算答案
	cout<<ans;
	return 0;
}

后记

其实也没啥好说的

这是本蒟蒻的第一篇题解,

最后,若有错误,还请各位dalao指出!

完结撒花

\(By\) \(FHenryh\)

标签:尝试,洛谷,int,题解,P7792,long,次数,钥匙,扇门
From: https://www.cnblogs.com/FHenryh/p/solution-LG-P7792.html

相关文章

  • 【题解】P4899 [IOI2018] werewolf 狼人
    そうやってただ日が暮れるまで語り掛ける本当の言葉题意给定一个有向图和若干询问,每次询问是否存在一条满足条件的路径:端点分别为\(u,v\)前面一段不经过\([1,L......
  • 传递游戏【题解】
    Description毛大神最近在玩一个传递游戏,即有\(N\)个人在做传递物品的游戏,这N个人的编号为\(1,2,3,...,N-1,N\)。游戏规则是这样的:开始时物品可以在任意一人手上,他可把物......
  • 表达式的值【题解】
    [NOIP2011普及组]表达式的值题目描述对于1位二进制变量定义两种运算:运算的优先级是:先计算括号内的,再计算括号外的。“×”运算优先于“⊕”运算,即计算表达式......
  • [NOIP2017 普及组]跳房子 【题解】
    题目背景NOIP2017普及组T4题目描述跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一。跳房子的游戏规则如下:在地面上确定一个起点,然后在起点......
  • 洛谷 P8077 [WC2022] 序列变换 题解
    题目链接。WC2023之前补一下WC2022的题,参考了官方题解。首先,把括号序列转化为二叉树,\(\texttt{(A)B}\)转为一个点的左子树是\(A\),右子树是\(B\)。相当于括号序列先......
  • 1.8模拟赛题解
    T1考虑每次反弹后,球的运动轨迹都会偏移\(2\beta\),总偏移量即为\(2k\beta\),而最后需要回到原点,因此\(360|2k\beta\),简单求\(\gcd\)即可。T2设\(ans_k\)表示出现过......
  • 1.11模拟赛题解
    T1对于方阵\(A\),考虑其反方阵\(A'\)。容易发现\(A\)与\(A'\)的权值和相同,而其中必有一个与\(B\)的差不超过\(\lfloor\frac{nm}{2}\rfloor\),因此判断一下哪个满足......
  • 1.9模拟赛题解
    T1从左到右扫描,首先如果\(a_i<b_i\)那么一定无解,否则不断在其右边找最近的\(j\)使得\(a_j\in[b_i,a_i]\),把\(a_i\)和\(a_j\)交换。感性理解这是对的。T2先证操......
  • 1.12模拟赛题解
    T1容易知道答案为原图的最大子二分图大小。枚举每个点在二分图的左边还是右边,计算出答案。时间复杂度\(O(2^n\timesm)\)。T2考虑递推构造方案。假设现在已经有了一组......
  • POI Excel格式报表生成 同步下载问题解决
    前言解决POI导出功能,过时方法和新增样式放在最下面或者参考下文POI样式调节0.maven(新版本)<poi.version>4.1.2</poi.version> <dependency> <groupId>org.ap......