Josephus环形排列问题

题目:设n个人围坐在一圆桌周围,依次编号为1,2,...,n,从第s个人从1开始依次报数,数到m的人出列,然后从出列的下一个人重新开始报数,数到m的人又出列,…,如此反复直到只剩一人为止为止。对于任意给定的n,s和m,输出按出列次序得到的n个人员的序列。

代码如下:

#include<stdio.h>int a[100];
void dele(int x,int t)        //定义数组删除元素函数
{
     int j;
     if(x==t)
          a[x]=0;
     for(j=x;j<=t;j++)
     {
          a[j]=a[j+1];
          a[t+1]=0;
     }
}
void jose(int n,int m)
{
     int i,len,cycle;  //len表示当前数组的长度,cycle表示当前报数人报出的数。
     for(i=1;i<=n;i++)
          a[i]=i;
     cycle=1;
     len=n;
     i=1;
     while(len>1)
     {
            if(i>len)
          {
               i=0;
                  cycle--;
          }
          if(cycle==m)
          {
               dele(i,len);
               len--;
                  if(i>len)   //删除当前元素后,当前位置已经没有元素。
                  {
                       cycle=0;
                  }
                  else
                  {
                       cycle=1;
                  }
          }
          i++;
          cycle++;

     }
}
int main()
{
     int s1,s2;
     scanf("%d %d",&s1,&s2);
     if(s1>0&&s2>0)
     {
         if(s2==1)
         printf("%d\n",s1);
else if(s2>1)
{
          jose(s1,s2);
     printf("%d\n",a[1]);
}
     scanf("%d %d",&s1,&s2);
     }
     return 0;
}

  

时间: 2024-08-25 06:22:19

Josephus环形排列问题的相关文章

uvalive 2756 环形排列颠倒的次数

n participants of «crazy tea party» sit around the table. Each minute one pair of neighbors can change their places. Find the minimum time (in minutes) required for all participants to sit in reverse order (so that left neighbors would become right,

【网络流24题】No.19 负载平衡问题 (费用流)

[题意] G 公司有 n 个沿铁路运输线环形排列的仓库, 每个仓库存储的货物数量不等. 如何用最少搬运量可以使 n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入文件示例input.txt517 9 14 16 4 输出文件示例output.txt11 [分析] 其实我觉得这题可以贪心啊..n^2贪心??.没细想.. 打的是费用流.. 大概这样建图: 懒得写了..凌乱之美.. 求满流费用.. 1 #include<cstdio> 2 #include<cstdlib&

负载平衡(cogs 741)

?问题描述:G 公司有n 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使n 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运.?编程任务:对于给定的n 个环形排列的仓库的库存量,编程计算使n 个仓库的库存数量相同的最少搬运量.?数据输入:由文件overload.in提供输入数据.文件的第1 行中有1 个正整数n(n<=100),表示有n个仓库.第2 行中有n个正整数,表示n个仓库的库存量.?结果输出:程序运行结束时,将计算出的最少搬运量输出到文件ove

[网络流专练6][线性规划与网络流剩余部分题解]

orz"orzGEOTCBRL" 6:lis 给定正整数序列x1 ,…… , xn. (1)计算其最长递增子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的递增子序列. (3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长 度为s的递增子序列.  看到题目就666了,前两问不是经典dp?因为序列是上升的,所以如果在x1前面加一个x1,个数显然多了f[x2][xn][s-1],或者xn后面加一个xn, 一样的……然后发现题意理解错T_T “多

【65测试20161114】【字符串】【DP】

第一题 复制&粘贴: 文件的内容是一个字符串S,对其进行N次复制&粘贴的操作,第i次操作复制位置Ai和位置Bi之间的所有文字,然后在位置Ci粘贴.这里位置x表示字符串的第x个字符的后面那个位置(位置0表示字符串的开头),例如字符串”copypaste”的位置6表示字符’a’和字符’s’之间的位置,位置9表示’e’后面的位置(即字符串的结尾).不过,如果操作后的字符串长度超过了M,那么将超过的部分删除,只保留长度为M的前缀.你的任务是写一个程序,输出N次操作后字符串的前K个字符. 对于40%

1362 : 修补木桶 -- 最长的最短边

描述 一只木桶能盛多少水,并不取决于桶壁上最高的那块木板,而恰恰取决于桶壁上最短的那块. 已知一个木桶的桶壁由N块木板组成,第i块木板的长度为Ai. 现在小Hi有一个快捷修补工具,每次可以使用修补工具将连续的不超过L块木板提高至任意高度. 已知修补工具一共可以使用M次(M*L<N),如何修补才能使最短的那块木板最高呢? 注意: 木板是环形排列的,第N-1块.第N块和第1块也被视为连续的. 输入 第1行:3个正整数,N, M, L.分别表示木板数量,修补工具使用次数,修补工具每次可以同时修补的木板

求一个非负整数数组中不相邻元素之和的最大值

该题来自leetcode,原题如下: You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connecte

(转)石子合并问题

本文转自 http://blog.csdn.net/acdreamers/article/details/18039073 石子合并问题是最经典的DP问题.首先它有如下3种题型:   (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量.求将这N堆石子合并成一堆的总花费最小(或最大). 分析:当然这种情况是最简单的情况,合并的是任意两堆,直接贪心即可,每次选择最小的两堆合并.本问题实际上就是哈夫曼的变形.     (2)有N堆石

数论 UVALive 2756

这道题目考察的n个不同的数环形排列,每次相邻两个数交换位置,这样由正序转变成逆序所需操作的最小次数t. 公式:环形排列:t= n/2*(n/2 - 1)/2 + (n+1)/2* ((n+1)/2 - 1)/2 在这里在补充下线性排列的公式:t=n*(n-1)/2 #include<iostream>using namespace std;int main(){ int t; cin>>t; while(t--) { int n,ans; cin>>n; ans=(n/