zoukankan      html  css  js  c++  java
  • 1074 约瑟夫环 V2

    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 }

     



  • 相关阅读:
    jfreechart简单介绍---曲线图
    Java监听器
    在java里actionPerformed是做什么用的
    sqlserver,oracle,mysql等的driver驱动,url怎么写
    ibatis入门实例(完整)
    java连接access数据库的三种方式以及远程连接
    elementui入门以及nodeJS环境搭建
    vue路由
    vue模板语法下
    vue模板语法上
  • 原文地址:https://www.cnblogs.com/zllwxm123/p/7390648.html
Copyright © 2011-2022 走看看