博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA1452|LA4727-----Jump------经典的约瑟夫公式的变形(DP)
阅读量:7251 次
发布时间:2019-06-29

本文共 1851 字,大约阅读时间需要 6 分钟。

本文出自:

题目地址:

题目意思:

给你编号1~n的数,每次从格k个删一个数,会有一个顺序

让你给出最后三个被删除的数

解题思路:

这题很明显就是约瑟夫的变形

假设编号从0~n-1

我们令f[1]=0   表示还剩1个时最后被删掉的一定是0

那么经典的约瑟夫公式变为f[n]=(f[n-1]+k)%n

表示剩n个时最后一个被删掉的

我们可以想到,如果我们知道剩2个的时候,被删除的是谁,剩3个的时候被删掉的是多少

然后再根据上面的公式就可以搞定了

通过本题,让我更进一步的理解了约瑟夫公式

下面是两种不同代码:

直接推出倒数被删掉的(未证明)

 

#include
#include
#include
using namespace std;int main(){ int n,k; int t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k); int x; x=(k+2)%3; for(int i=4;i<=n;i++) x=(x+k)%i; printf("%d ",x+1); x=(k+1)%2; for(int i=3;i<=n;i++) x=(x+k)%i; printf("%d ",x+1); x=0; for(int i=2;i<=n;i++) x=(x+k)%i; printf("%d\n",x+1); } return 0;}

下面给出自己推的

 

 

#include
#include
#include
using namespace std;int main(){ int t; scanf("%d",&t); while(t--) { int n,k; scanf("%d%d",&n,&k); int ans1=0; int ans2,ans3; for(int i=2;i<=n;i++) { ans1 = (ans1+k)%i; if(i==2)//当剩下2个的,倒数第二个被删除的就是和倒数第一个不同的,答案只有0,1 { ans2 = !ans1; } else if(i==3)//当剩下3个的时候,就是在0,1,2里面找不是ans1,ans2的 { ans2 = (ans2+k)%i; int v[3]; memset(v,false,sizeof(v)); v[ans1] = 1; v[ans2] = 1; for(int j=0;j<3;j++) if(!v[j]) { ans3 = j; break; } } else { ans2 = (ans2+k)%i; ans3 = (ans3+k)%i; } } ans1 = ans1+1; ans2 = ans2+1; ans3 = ans3+1; printf("%d %d %d\n",ans3,ans2,ans1); } return 0;}

 

 

转载地址:http://sphbm.baihongyu.com/

你可能感兴趣的文章
Azure Redis Cache (2) 创建和使用Azure Redis Cache
查看>>
python统计ES存储空间占用的代码
查看>>
成就连自己都惊讶的未来
查看>>
依赖倒置(DIP)与依赖注入(DI)
查看>>
mysql数据库授权
查看>>
Microstation
查看>>
深入浅出的英语口语700句zz
查看>>
linux编译安装php
查看>>
再谈奶牛问题
查看>>
第一个java程序------hello world!
查看>>
C#学习安排表
查看>>
在LINUX上创建GIT服务器【转】
查看>>
Linux内核跟踪之trace框架分析【转】
查看>>
XCode v9.6.2017.0830
查看>>
ES不设置副本是非常脆弱的,整个文章告诉了你为什么
查看>>
设置nmon 每天自动收集性能信息
查看>>
python写一段脚本代码自动完成输入(目录下的所有)文件的数据替换(修改数据和替换数据都是输入的)【转】...
查看>>
JVM的内存分配与垃圾回收策略
查看>>
分布式设计与开发(二)------几种必须了解的分布式算法
查看>>
IT高管和易筋经的故事
查看>>