欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

HDOJ 1443 約瑟夫環(huán)的最新應用分析詳解

 更新時間:2013年05月24日 11:23:40   作者:  
本篇文章是對HDOJ 1443 約瑟夫環(huán)的最新應用進行了詳細的分析介紹,需要的朋友參考下
k個男生和k個女生站成一列,前面k個是男生,后面k個是女生,從第一個男生開始報數(shù),報到隊列最后一個同學,循環(huán)到隊首繼續(xù)報,并且如果一個同學報到的數(shù)是m,這個同學就出列,然后后面的同學繼續(xù)從1開始報數(shù),現(xiàn)在求一個數(shù)m,使k個女生全部出列,而男生沒有出列。

輸入:男生女生的個數(shù)k(男生女生人數(shù)相等都為k,輸出:m值
例: 輸入:2,輸出:7
輸入:4,輸出:30

本題是約瑟夫環(huán)變形 先引入Joseph遞推公式,設有n個人(0,...,n-1),數(shù)m,則第i輪出局的人為f(i)=(f(i-1)+m-1)%(n-i+1),f(0)=0; f(i) 表示當前子序列中要退出的那個人(當前序列編號為0~(n-i));
拿個例子說:K=4,M=30;
復制代碼 代碼如下:

f(0)=0;
      f(1)=(f(0)+30-1)%8=5; 序列(0,1,2,3,4,5,6,7)中的5
      f(2)=(f(1)+30-1)%7=6; 序列(0,1,2,3,4,6,7)中的7
      f(3)=(f(2)+30-1)%6=5; 序列(0,1,2,3,4,6)中的6
      f(4)=(f(3)+30-1)%5=4; 序列(0,1,2,3,4)中的4
      ........

依據(jù)題意,前K個退出的人必定是后K個人,所以只要前k輪中只要有一次f(i)<k則此m不符合題意。
注意:
本題有幾點需要注意,否則很容易超時;
第一點、運用公式j=(j+m-1)%(n-i),推導出下一個出現(xiàn)的元素在第幾號位置,如果j<k的話,不符合題意。
第二點、就是m,當只剩下k+1個數(shù)的時候,則上一個消失的數(shù)一定是在目前僅剩的bad左邊或者是右邊,所以m%(k+1)==0或者1
有了這兩個條件,可以加快程序的速度。。。
完整的實現(xiàn)代碼如下:
復制代碼 代碼如下:

#include "stdio.h"
#include "stdlib.h"
int x[15];
/*
運用公式j=(j+m-1)%(len-i);推導出下一個出現(xiàn)的元素在第幾號位置,如果j<k的話,不符合題意。
若有7個人,報到3的人依次出列
第一次 j=(j+m-1)%(len-i)=(0+3-1)%(7-0)=2   下標為2的3出列   新序列為  1 2 4 5 6 7
第二次 j=(j+m-1)%(len-i)=(2+3-1)%(7-1)=4   下標為4的6出列   新序列為  1 2 4 5 7
第三次 j=(j+m-1)%(len-i)=(4+3-1)%(7-2)=1   下標為1的2出列   新序列為  1 4 5 7
第四次 j=(j+m-1)%(len-i)=(1+3-1)%(7-3)=3   下標為3的7出列   新序列為  1 4 5
第五次 j=(j+m-1)%(len-i)=(3+3-1)%(7-4)=2   下標為2的5出列   新序列為  1 4
第六次 j=(j+m-1)%(len-i)=(2+3-1)%(7-5)=0   下標為0的1出列   新序列為  4
第七次 j=(j+m-1)%(len-i)=(0+3-1)%(7-6)=0   下標為0的4出列   新序列為空,至此,所有人已經(jīng)全部出列,出列的順序為:3 6 2 7 5 1 4
*/
int test(int k,int m)
{
 int i,j=0,len=k*2;
 for(i=0;i<k;i++)
 {
  j=(j+m-1)%(len-i);    //約瑟夫環(huán)公式
  if(j<k)
   return 0;     //遇到前k輪中有小于k的直接返回0
 }
 return 1;
}
/*
接下來說說m的取值范圍:我們考察一下只剩下k+1個人時候情況,即壞人還有一個未被處決,
那么在這一輪中結束位置必定在最后一個壞人,那么開始位置在哪呢?這就需要找K+2個人的結束位置,
然而K+2個人的結束位置必定是第K+2個人或者第K+1個人,這樣就出現(xiàn)兩種順序情況:GGGG.....GGGXB 或  GGGG......GGGBX (X表示有K+2個人的那一輪退出的人)所以有K+1個人的那一輪的開始位置有兩種可能即最后一個位置或K+1的那個位置,限定m有兩種可能:
GGGG......GGGBX 若K+2個人的結束位置在最后一個(第K+2個),則m%(k+1)==0
GGGG......GGGXB 若K+2個人的結束位置在倒數(shù)第二個(第K+1個),則m%(k+1)==1
*/
void Joseph(void)
{
 int m,k;
 for(k=1;k<15;k++)
 {
  m=k+1;
  while(1)
  {
   if(test(k,m))     // m%(k+1)==0的情況
   {
    x[k]=m;
    break;
   }
   if(test(k,m+1))     // m%(k+1)==1的情況
   {
    x[k]=m+1;
    break;
   }
   m+=k+1;
  }
 }
}
int main(void)
{
    int k;
 Joseph();
 while(scanf("%d",&k),k)
  printf("%d\n",x[k]);
 system("pause");
}

相關文章

  • C語言入門篇--定義宏#define的概述

    C語言入門篇--定義宏#define的概述

    本篇文章是C語言系列基礎篇,適合c語言剛入門的朋友,本文對關于c語言的定義宏#define作了簡要的概述,希望可以幫助大家快速入門c語言的世界,更好的理解c語言
    2021-08-08
  • STL常用算法之排序算法詳解

    STL常用算法之排序算法詳解

    這篇文章主要介紹了STL常用算法之排序算法詳解,STL提供了六大組件,彼此之間可以組合套用,這六大組件分別是:容器、算法、迭代器、仿函數(shù)、適配器、空間配置器,本文主要講算法中的排序算法,需要的朋友可以參考下
    2024-01-01
  • C語言下快速排序(挖坑法)詳解

    C語言下快速排序(挖坑法)詳解

    大家好,本篇文章主要講的是C語言下快速排序(挖坑法)詳解,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C語言實現(xiàn)紅黑樹的實例代碼

    C語言實現(xiàn)紅黑樹的實例代碼

    這篇文章主要介紹了C語言實現(xiàn)紅黑樹的實例代碼,有需要的朋友可以參考一下
    2013-12-12
  • C++智能指針詳解

    C++智能指針詳解

    從比較簡單的層面來看,智能指針是RAII(Resource Acquisition Is Initialization,資源獲取即初始化)機制對普通指針進行的一層封裝。這樣使得智能指針的行為動作像一個指針,本質上卻是一個對象,這樣可以方便管理一個對象的生命周期
    2022-08-08
  • C++實現(xiàn)假裝藍屏整蠱小程序

    C++實現(xiàn)假裝藍屏整蠱小程序

    因為工作的需要,有時候我們離開時并不想讓別人看到我們電腦的內容,所以本文為大家分享了一個基于C++實現(xiàn)的假裝藍屏的小程序,需要的可以參考下
    2023-06-06
  • 詳談C++的內存泄漏問題

    詳談C++的內存泄漏問題

    下面小編就為大家?guī)硪黄斦凜++的內存泄漏問題。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • C語言中使用qsort函數(shù)對自定義結構體數(shù)組進行排序

    C語言中使用qsort函數(shù)對自定義結構體數(shù)組進行排序

    這篇文章主要介紹了C語言中使用qsort函數(shù)對自定義結構體數(shù)組進行排序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Qt之ui在程序中的使用-多繼承法介紹

    Qt之ui在程序中的使用-多繼承法介紹

    本文將介紹Qt之ui在程序中的使用-多繼承法,需要的朋友可以參考
    2012-11-11
  • 基于C++實現(xiàn)TCP聊天室功能

    基于C++實現(xiàn)TCP聊天室功能

    這篇文章主要為大家詳細介紹了基于C++實現(xiàn)TCP聊天室功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論