码迷,mamicode.com
首页 > 其他好文 > 详细

1074 约瑟夫环 V2

时间:2017-08-18 18:41:50      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:namespace   typedef   lis   algo   bit   black   font   const   个人   

1074 约瑟夫环 V2技术分享

基准时间限制:1 秒 空间限制:131072 KB 分值: 160 难度:6级算法题
技术分享 收藏
技术分享 关注
N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数。问最后剩下的人的编号。
例如:N = 3,K = 2。2号先出列,然后是1号,最后剩下的是3号。
Input
2个数N和K,表示N个人,数到K出列。(2 <= N <= 10^18, 2 <= K <= 1000)
Output
最后剩下的人的编号
Input示例
3 2
Output示例
3
这题是真的卡时间啊,就差0.01秒,十多组数据都是差那么长时间.
想了好久,凭我现在能力也优化不了我的代码,借用一下大佬的代码AC.
留在这以后看.
 1 #include<bits/stdc++.h>  //正常思路
 2 using namespace std;
 3 typedef long long ll;
 4 #define rep(i,l,r) for(int i=l;i<=r;++i)
 5 const int K=1e6+5;
 6 bool b[K];
 7 int k;
 8 ll dfs(const ll &n){
 9     if(n<=k){
10         int ans=0;
11         rep(i,2,n) ans=(ans+k)%i;
12         return ans;
13     }
14     ll ans=dfs(n-n/k);
15     return ( ans+n/k*k+ (ans-n%k)/(k-1) )%n;
16 }
17 int main(){
18     ll n;
19     cin>>n>>k;
20     cout<<dfs(n)+1;
21 }
22 
23 
24 
25 //大佬说用图像做的,具体的能看懂就自己看
26 #include<iostream>
27 #include<cstdio>
28 #include<cstring>
29 #include<algorithm>
30 using namespace std;
31 int main(){
32     unsigned long long i,j,n,k;
33     cin>>n>>k;
34     long long y=k%2;
35     long long x=2,t=0;
36     long long z1,z2;
37     z1=y;
38     z2=x;
39     while(x<=n){
40         z1=y;
41         z2=x;
42         t=(x-y)/(k-1);
43         if(t==0) t++;
44         y=y+t*k-((y+t*k)/(x+t))*(x+t);
45         x+=t;
46    }
47     cout<<(z1+(n-z2)*k)%(n)+1<<endl;
48 }

 



1074 约瑟夫环 V2

标签:namespace   typedef   lis   algo   bit   black   font   const   个人   

原文地址:http://www.cnblogs.com/zllwxm123/p/7390648.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!