UVa 1452 - Jump(约瑟夫环变形)


本文出自   http://blog.csdn.net/shuangde800



题目点击打开链接


题意

把1~n按逆时针顺序排成一个圆圈,从1开始没k个数字删除掉一个,知道所有数字都删完。

求最后删除的3个数。


思路

我们已经知道了,怎么可以推出最后一个被删除的编号(可参考百度百科

f(1) = 0, 表示最后还剩下一个时,这个编号为0

f(n) = (f(n-1) + m) % n

那么保存最后第1,2,3个数,一直推到第一个即可。


代码

/**==========================================
 *   This is a solution for ACM/ICPC problem
 * 
 *   @source:  uva-1452 Jump
 *   @author: shuangde
 *   @blog: blog.csdn.net/shuangde800
 *   @email: zengshuangde@gmail.com
 *===========================================*/
#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
         #include 
        
          #include 
         
           using namespace std; typedef long long int64; const int INF = 0x3f3f3f3f; const double PI = acos(-1.0); const int MAXN = 110; int n, m; int main(){ int T; scanf("%d", &T); while(T--){ scanf("%d%d", &n, &m); int ans1 = 0, ans2, ans3; for(int i=2; i<=n; ++i){ ans1 = (ans1+m) % i; if(i==2){ // 当剩下最后2个数时,编号为0,1, 推出倒数第二个删除的数当前值 ans2 = !ans1; }else if(i==3){ // 当剩下最后3个数时,编号为0,1,2, 推出倒数第三个删除的数当前值 ans2 = (ans2+m) % i; bool vis[3]; memset(vis, 0, sizeof(vis)); vis[ans1] = vis[ans2] = true; for(int j=0; j<3; ++j)if(!vis[j]){ ans3 = j; break; } }else{ ans2 = (ans2+m) % i; ans3 = (ans3+m) % i; } } ans1 = (ans1+1)%n; ans2 = (ans2+1)%n; ans3 = (ans3+1)%n; printf("%d %d %d\n", ans3?ans3:n, ans2?ans2:n, ans1?ans1:n); } return 0; } 
          
         
       
      
      
     
     
    
    
   
   


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值