【51nod - 1875】 丢手绢(约瑟夫问题,可打表,用STL模拟)

题干:

六一儿童节到了,小朋友们在玩丢手绢的游戏。总共有C个小朋友,编号从1到C,他们站成一个圈,第i(1<i<=C)个人的左边是i-1,第1个人的左边是C。第i(1<=i<C)个人的右边是i+1,第C个人的右边是1。然后再给出一个常数E。刚开始的时候1号小朋友拿着手绢,接下来游戏开始,在游戏的每一轮,拿手绢的人会把手绢向右边传递E-1个人,拿到手绢的人退出圈,把手绢递给他右边的小朋友,剩下的人向中间挨紧,把圈中的空位补满。然后开始下一轮,如此往复。直到圈中只剩一个人。比如C=6,E=5的时候,出圈的顺序是5,4,6,2,3,最后1号小朋友留在了圈中。

现在有2G个小朋友,要求一个最小的常数E,使得这2G个小朋友玩了G轮游戏之后,出圈的小朋友编号刚好是G+1到2G。

 

Input

多组测试数据。 
每一行给出一个整数G( 0 < G < 14),G=0的时候表示输入结束。

Output

输出多行,表示每一组数据的答案。

Sample Input

3
4
0

Sample Output

5
30

解题报告:

预处理打表过即可。

主要是学习一下vector处理这种问题的方法。

vector放入数据之后。

开始遍历

设置一个变量为当前值,一个变量为变化后的值。

变化后的值为 (当前值+移动数-1)%(vector数组的大小)

让vis数组标记下变化后的位置的值,表示已经被剔除了。

执行vector.earse(vector.begin()+ 变化后的值),在vector中删除这个值。

之后让当前值 等于 变化后的值。

一个循环结束,重复即可。

先上一个非常不清真的代码:

#include<bits/stdc++.h>using namespace std;
bool vis[105];
int n,res,cur;
bool solve(int e) {memset(vis,0,sizeof(vis));int i=1;cur = 0;while(i <= (n/2)) {//这里的while也太不清真了、、 int num = 0;while(1) {if(vis[cur]==1) {cur=(cur+1)%n;continue;//这写的太不清真了,变量加减太随意。很容易出漏洞啊!!包括那种,高速路加油问题,变量的变化的地点要清真一点! }cur=(cur+1)%n;if(vis[cur] == 1) continue;num++;if(num == e) {if(cur < (n/2)) return 0;vis[cur]=1;do{cur=(cur+1)%n;	}while(vis[cur]);break;}}i++;}return 1;
}

所以各种无输出啊死循环啊的情况、、、 

改进以后

bool solve(int e) {memset(vis,0,sizeof(vis));cur = 0;for(int i = 1; i<=(n/2); i++) {int num = 0;while(1) {cur=(cur+1)%n;if(vis[cur] == 1) continue;num++;if(num == e) {if(cur < (n/2)) return 0;vis[cur]=1;do{cur=(cur+1)%n;	}while(vis[cur]);break;}}}return 1;
}
int main()
{int ans[20] = {0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};while(cin>>n) {if(n == 0) break;printf("%d\n",ans[n]);}return 0 ;} 

算是可以输出了,但是e从2到1000W遍历的耗时太长啦!所以标解肯定不是这么做的、、说明我们的模拟有问题,然后换了STL中的vector模拟这个过程,去掉一些无用的过程。 

还有一种比较快的方法:(类似约瑟夫环的解法,不知道为什么可以这样)

#include<bits/stdc++.h>using namespace std;
typedef long long ll;
const int maxn = 1e3+5;
pair<int,int> pr;
int arr[maxn];
int n;
int ans[20] = {0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};
bool judge(int k)
{int m = 2*n, cur = 1;for(int i=0; i<n; i++){cur = (cur+k)%m;cur==0 ? cur=m : cur=cur;if(cur<=n)return false;m--;}return true;
}
int main( )
{init( );while(cin>>n && n!=0){for(int i=n; ;i++){if(judge(i)){cout<<i+1<<endl;break;}if(i%(2*n)<n)i += n-1;}//cout<<ans[n]<<endl;}return 0;
}

下面是用vector模拟的过程:

#include<iostream>
#include<list>
#include<vector>
#include<algorithm>
using namespace std;
const int MAXN = 15;//模拟,判断E时候合适
bool check(int G,int E){if(1+E<G) return false;vector<int> vec;for(int i=1;i<=2*G;i++){vec.push_back(i);}int vis[2*MAXN] = {0};int now = 0,next,len = 2*G+1;for(int i=0;i<G;i++){next = (now+E-1)%(vec.size());vis[vec[next]] = 1;vec.erase(vec.begin()+next);now = next % (vec.size());}//检查for(int i=G+1;i<=2*G;i++){if(!vis[i]) return false;}return true;
}//模拟得到的结果
const int E[] = {0,2,7,5,30,169,441,1872,7632,1740,93313,459901,1358657,2504881};int main()
{int G;    //记录1-3的值/*得到结果**/for(int i=1;i<=13;i++){int E=2;while(!check(i,E)) ++E;cout<<E<<",";}while(cin>>G && G){cout<<E[G]<<endl;}return 0;
}

 

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

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

相关文章

mysql server远程连接_本地远程连接 MySQL server

问题MySql Server 出于安全方面考虑默认只允许本机(localhost, 127.0.0.1)来连接访问。如果想远程访问&#xff0c;需要额外做下操作。配置修改定位文件/etc/mysql/mysql.conf.d/mysqld.cnf定位属性skip-networking #注释掉 因为它是屏蔽掉一切TCP/IP连接bind-address 127.0.0…

关闭VS警告#pragma warning(disable:4996)

代码实现&#xff1a; #pragma warning(disable:4996) 1. #pragma warning只对当前文件有效&#xff08;对于.h&#xff0c;对包含它的cpp也是有效的&#xff09;&#xff0c;而不是对整个工程的所有文件有效。当该文件编译结束&#xff0c;设置也就失去作用。 2. #pragma wa…

【CodeForces - 608C】Chain Reaction (二分 或 dp ,思维)

题干&#xff1a; 题目大意&#xff1a; 题意是在一条直线上坐落着不同位置的灯塔&#xff0c;每一个灯塔有自己的power level&#xff0c;当作是射程范围。现在从最右边的灯塔开始激发&#xff0c;如果左边的灯塔在这个灯塔的范围之内&#xff0c;那么将会被毁灭。否则会被激…

java关闭文本_如何更优雅的关闭java文本、网络等资源

通常在 java 中对文本、网络资源等操作起来是很繁杂的&#xff0c;要声明&#xff0c;读取&#xff0c;关闭三个阶段&#xff0c;还得考虑异常情况。假设我们要读取一段文本显示到控制台&#xff0c;通常会有如下的代码&#xff1a;public static void main(String[] args) {Fi…

java类匿名类实例_Java匿名类,匿名内部类实例分析

本文实例讲述了Java匿名类&#xff0c;匿名内部类。分享给大家供大家参考&#xff0c;具体如下&#xff1a;本文内容&#xff1a;内部类匿名类首发日期 &#xff1a;2018-03-25内部类&#xff1a;在一个类中定义另一个类&#xff0c;这样定义的类称为内部类。【包含内部类的类可…

【HDU - 6441】Find Integer (费马大定理 + 奇偶数列法构造勾股定理)

题干&#xff1a; people in USSS love math very much, and there is a famous math problem . give you two integers nn,aa,you are required to find 22 integers bb,cc such that ananbncnbncn. Input one line contains one integer TT;(1≤T≤1000000)(1≤T≤100000…

dart与java互调_Dart与Java不同的地方

数据类型基类是num数值型的操作运算符&#xff1a; 、 - 、* 、/ 、 ~/ 、 %/ 除法 整数余数~/ 除法 取整% 取余常用属性&#xff1a; isNaN、isEven、isOdd (是否非数字、奇偶)常用方法&#xff1a;abs()、round()、floorl()、ceil()、toInt()、toDouble()double nan 0.0 / 0…

算法学习 母函数

母函数又称生成函数。定义是给出序列:a0,a1,a2,.......ak,......,那么函数G(x)a0a1*xa2*x2......ak*xk称为序列a0,a1,a2,.......ak,......的母函数(即生成函数)。 例如&#xff1a;序列1,2,3.......n的生成函数为&#xff1a;G(x)x2x23x3........nxn。点此链接:百度百科 特别…

plsq卸载 删除注册表、_win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结...

win10操作系统下oracle11g客户端/服务端的下载安装配置卸载总结一&#xff1a;前提注意&#xff1a;现在有两种安装的方式1. oracle11g服务端(64位)oracle客户端(32位)plsql(32位)2. oracle11g服务端(32位)plsql(32位)这里我选择的是第二种 原因是 &#xff1a;首先需要明确ora…

【HDU -1568】 Fibonacci(斐波那契通项公式+取对数)

Fibonacci Problem Description 2007年到来了。经过2006年一年的修炼&#xff0c;数学神童zouyu终于把0到100000000的Fibonacci数列 (f[0]0,f[1]1;f[i] f[i-1]f[i-2](i>2))的值全部给背了下来。 接下来&#xff0c;CodeStar决定要考考他&#xff0c;于是每问他一个数字&a…

java sqlserver分页查询_实现sqlserver分页查询语句

实现sqlserver分页查询语句sqlServer&#xff1a;一次查询&#xff0c;数据库只返回一页的数据。而不是取出所有的数据。pagesize&#xff1a; 每页显示记录数cureentpage&#xff1a;当前页数select * from ( select TOP pagesize * from ( SELECT TOP pagesize*cureentpage…

【HDU - 1269】迷宫城堡 (tarjan算法模板)

题干&#xff1a; 为了训练小希的方向感&#xff0c;Gardon建立了一座大城堡&#xff0c;里面有N个房间(N<10000)和M条通道(M<100000)&#xff0c;每个通道都是单向的&#xff0c;就是说若称某通道连通了A房间和B房间&#xff0c;只说明可以通过这个通道由A房间到达B房间…

php5.4 curl,PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析

本文实例分析了PHP5.0~5.6 各版本兼容性cURL文件上传功能。分享给大家供大家参考&#xff0c;具体如下&#xff1a;最近做的一个需求&#xff0c;要通过PHP调用cURL&#xff0c;以multipart/form-data格式上传文件。踩坑若干&#xff0c;够一篇文章了。重要警告没事不要读PHP的…

【HDU - 1518】Square (经典的dfs + 剪枝)

题干&#xff1a; Given a set of sticks of various lengths, is it possible to join them end-to-end to form a square? Input The first line of input contains N, the number of test cases. Each test case begins with an integer 4 < M < 20, the number …

php发扑克牌,php 扑克牌代码的简单例子

本文分享下&#xff0c;一段可模拟扑克牌玩法的php代码&#xff0c;有需要的朋友参考下。php 扑克牌代码&#xff0c;如下&#xff1a;cut();* www: jbxue.com*/class cards{/**** Declare our deck variable**/private $deck;/**** Constructor.. duh!**/function __construct…

【HDU - 1026 】Ignatius and the Princess I (bfs + 记录路径)

题干&#xff1a; The Princess has been abducted by the BEelzebub feng5166, our hero Ignatius has to rescue our pretty Princess. Now he gets into feng5166s castle. The castle is a large labyrinth. To make the problem simply, we assume the labyrinth is a N*…

php多线程模拟请求,浅谈php使用curl模拟多线程发送请求

每个PHP文件的执行是单线程的&#xff0c;但是php本身也可以用一些别的技术实现多线程并发比如用php-fpm进程&#xff0c;这里用curl模拟多线程发送请求。php的curl多线程是通过不断调用curl_multi_exec来获取内容&#xff0c;这里举一个demo来模拟一次curl多线程并发操作。//设…

【HDU - 1455】Sticks (dfs + 剪枝)

题干&#xff1a; George took sticks of the same length and cut them randomly until all parts became at most 50 units long. Now he wants to return sticks to the original state, but he forgot how many sticks he had originally and how long they were original…

java找不到符号类socket,编译报错+解决方法:错误: 找不到符号

public class ServerPlainTest { // 包内包外可见public static void main(String[] args) {try {ServerSocket ss new ServerSocket(8189);System.out.println("the server has startuped, waiting for connections.");while (true) { // accept multiple clients …

php hbase thrift,PHP使用Thrift操作Hbase

系统架构图HBase 启动 Thrift服务hbase启动thrift服务// 进入安装的hbase bin目录下// 执行hbase-daemon.sh start thrift2需要注意的是&#xff0c;这里启动的是thrift2服务&#xff0c;如果需要启动thrift服务只需要将thrift2改为thrift就可以了&#xff0c;具体thrift和thri…