首页 > 其他分享 >洛谷P2696之慈善的约瑟夫——题解

洛谷P2696之慈善的约瑟夫——题解

时间:2024-08-01 11:50:42浏览次数:8  
标签:洛谷 P2696 题解 ll 队列 ans

洛谷P2696题解

[传送锚点](P2696 慈善的约瑟夫 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
比不过大佬,从蒟蒻做起
选择比较有意思的解法——用队列模拟(还是窝太弱了)


正片开始

考虑队列模拟,因为每次都是假的剔除,所以我们的目标是找到每回游戏的最终存活者。
将不被剔除,即每次编号求余2结果为1的人再次扔进队列里,直到队列长度为一,最后剩下的就是最终幸存者。

ll del(ll x)
{
	for(int i=1;i<=x;i++) q.push(i);
	int f=1;
	while(q.size()!=1)
	{
		int u=q.front();q.pop();
		if(f%2==1) q.push(u),f++;
		else f++;
	}
	int ans=q.front();
	q.pop();
	return ans;
}

接下来就可以开始快乐的处理答案了。
直接干while循环,直到最终幸存者(记为s)是序列的最后一人,对于每次剔除的人n-s,将ans+=n-s。结束循环前,将最后剩余的s人乘上2加到ans里即可。


完整代码

#include <bits/stdc++.h>
using namespace std; 
typedef long long ll;
queue<int>q;
ll del(ll x)
{
	for(int i=1;i<=x;i++) q.push(i);
	int f=1;
	while(q.size()!=1)
	{
		int u=q.front();q.pop();
		if(f%2==1) q.push(u),f++;
		else f++;
	}
	int ans=q.front();
	q.pop();
	return ans;
}
int n,ans;
int main() 
{
	cin>>n;
	while(1)
	{
		int s=del(n);
		if(s==n) 
		{
			ans+=2*s;
			break;
		}
		ans+=n-s;
		n=s;
	}
	cout<<ans<<endl;
	return 0;
} 


本蒟蒻实力有限,如有错误还请各位大佬指出。
谢谢

标签:洛谷,P2696,题解,ll,队列,ans
From: https://www.cnblogs.com/qc0817/p/18336369

相关文章

  • 题解:Pinely Round 4 (Div. 1 + Div. 2) C
    C.AbsoluteZerotimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputYouaregivenanarray\(a\)of\(n\)integers.Inoneoperation,youwillperformthefollowingtwo-stepmove:Choose......
  • 洛谷-P1171-售货员的难题
    Abstract传送门也算是状压dp模板题?不过这个数据给的有点阴间了,空间不够用,需要搞一个奇妙的优化。idea所谓状压,就是用数字表示当前状态,比如说0110100这个数字,我们可以把01分别看作是是否到达过第i个点的标记。那么我们可以用dp[i][j]表示第i个状态下,快递员到达j......
  • Codeforces 11D A Simple Task 题解 [ 蓝 ] [ 状压 dp ]
    思路不难想,细节比较多。思路观察到\(n\le19\),首先想到状压dp。于是自然地定义\(dp[j][i]\)为:抵达点的状态为\(i\),且此时在点\(j\)时,简单路径的条数。注意这里是简单路径的条数,而不是环的个数,因为环的个数要在dp过程中统计。这里的dp作用就在于求简单路径条数。......
  • [JOI 2020 Final] 火事 题解
    给一篇题解。(下面这张图是从luogu上粘贴的,因为不太会画图)其中纵坐标为\(t\),横坐标为\(a_i\)。发现同颜色块只有平行四边形和直角梯形(等腰直角三角形)两种情况。可以将直角梯形削去左下角,分成两部分考虑。等直可以直接暴力插入区间,总个数\(O(n)\)。平行四边形可以看作上......
  • [CF455D] Serega and Fun 题解
    不知道大家做没做过数列分块基础9题?插入删除操作可以用链表,线段树等数据结构都不好维护,考虑分块。对于修改操作,暴力重构受影响块的链表,发现除首尾块外,其他块都可以看作是区间左移一位,所以加头删尾即可。每个块开一个数组(绝对不能是\((un\_)map\),不然你会和我一样死的很诡异),表示......
  • HDU2024 R2 T9 题解
    考虑维护一下每个点的速度。把区间加拆成后缀加和后缀减,然后考虑后缀加。减就同理。考虑在一段后缀的目标速度增加之后,哪些时刻的加速度会变化。这里加速度必然只会变大\(1\),因此在这个时刻之后的速度都会增加\(1\),又由于目标速度也增加了\(1\),所以这个位置之后的加速度都不再......
  • CF455D Serega and Fun 题解
    Beforeit来当一回教练的题解翻译家,平衡树这种高级算法自然是不会的,所以详细讲一下STL。成为蒟蒻(也就是自己)的福音。Solution我们观察到题目要求“把第\(r\)个数插入在第\(l\)个数之前,其他数顺序不变“,使用\(deque\)的\(push\)_\(front\)和\(push\)_$back$操作可......
  • 暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法
    暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围pc端下载失败/卡正在初始化/连接伺服务器失败/问题解决方法暗区突围也可以在电脑上游玩拉,暗区突围PC端上线在即,本次上线就是全球抢先测试了,很多小伙伴在游戏下载过程中遇到了很多问题,比如:下载失......
  • QOJ6504 Flower‘s Land 2 题解
    QOJ6504Flower'sLand2题解题目链接:QOJ6504Flower'sLand2题意:给定一个只包含\(0,1,2\)的序列,\(T\)次询问,询问有两种:区间所有数加\(1\)然后模\(3\)求一段区间能否通过每次删掉相邻两个相同的数删完(如\(1,0,0,2,2,1\)就满足条件)题解:考虑用什么方法来维护区间......
  • CF1995C Squaring 题解
    思路详解:请注意,本题解用到了非整数计算,也就是说性能可能不如整数运算,但是易于实现,追求最优解的大佬不建议观看本题解。这个题看似简单,但是由于涉及到了平方操作,不用高精度根本存不下,然后如果你要用高精度的话又会T......