uva 1452(约瑟夫变形)

题意:有1到n顺时针坐在圆桌上,编号从1到n,从1开始顺时针报数,每k个出去一个人,输出倒数第三个出去、倒数第二个出去、倒数第一个出去的人的编号。

题解:n的范围是500000,肯定不能用链表来解,这就用到了约瑟夫问题的递推式:f[i] = (f[i - 1] + k) % i,初始f[1] = 0表示还剩1个人的时候最后出去的人编号一定是0(这里默认编号从0开始),那么根据递推式可以得到f[n]就是还剩n个人最后出去的人,倒数第二个人也可以通过这个式子推导出来:(k + 1) % 2是还剩两个人倒数第二个(也就是第一个)出去的人,这样推导n - 2次就是n个人中倒数第二个出去的人,同理可以得出倒数第三个人,结果都加1,因为编号从1开始。

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
int n, k;

int main() {
    int t;
    scanf("%d", &t);
    while (t--) {
        scanf("%d%d", &n, &k);
        int res1 = 0, res2, res3;
        for (int i = 2; i <= n; i++) {
            res1 = (res1 + k) % i;
            if (i == 2)
                res2 = (k + 1) % 2;
            else if (i == 3) {
                res2 = (res2 + k) % i;
                res3 = (k + 2) % 3;
            }
            else {
                res2 = (res2 + k) % i;
                res3 = (res3 + k) % i;
            }
        }
        printf("%d %d %d\n", res3 + 1, res2 + 1, res1 + 1);
    }
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-13 00:48:32

uva 1452(约瑟夫变形)的相关文章

Joseph UVA 1452 Jump

题目传送门 1 /* 2 数学:约瑟夫环问题的变形,首先定义f[i]表示剩下i个人时,最后一个选出的人,有个公式:f[i] = (f[i-1] + m) % i 3 f[1] = 0(编号从0开始),那么类似最后一个数的求法,先找到剩2个人和剩3个人时,最后的编号,然后跟着最后一个的一起递推 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :201

UVA 1452 八 Jump

Jump Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 1452 Integers 1, 2, 3,..., n are placed on a circle in the increasing order as in the following figure. We want to construct a sequence from these

不敢死队问题--约瑟夫变形

不敢死队问题 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 说到"敢死队",大家不要以为我来介绍电影了,因为数据结构里真有这么道程序设计题目,原题如下: 有M个敢死队员要炸掉敌人的一个碉堡,谁都不想去,排长决定用轮回数数的办法来决定哪个战士去执行任务.如果前一个战士没完成任务,则要再派一个战士上去.现给每个战士编一个号,大家围坐成一圈,随便从某一个战士开始计数,当数到5时,对应的战士就去执行任务,且此战士不再参加下

UVa 1394 约瑟夫问题的变形

https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4140 本来是要昨天来写这学习代码的,然后昨晚寝室又断电了,忍不住在这里吐槽一下,嗯,寝室天天断电. 题意就是输入n,k,m三个数,n个数排成一个圈,第一次删除m,以后每数k个数删除一次,求最后一个被删除的数. 言归正传,以前写过一个链表的约瑟夫问题,但是在这里肯定是会超时的.后来看了些参考

UVa 1471 (LIS变形) Defense Lines

题意: 给出一个序列,删掉它的一个连续子序列(该子序列可以为空),使得剩下的序列有最长的连续严格递增子序列. 分析: 这个可以看作lrj的<训练指南>P62中讲到的LIS的O(nlogn)的优化变形过来的问题. 预处理: Li是第i个元素Ai向左延伸的最大长度,即[i, i + Li - 1]是一个递增区间 同样地,Ri是第i个元素向右延伸的最大长度. 我们,可以枚举i, j(j<i 且 Aj < Ai),这样就可以把Aj和Ai“拼接”起来,所得到的最长连续递增子列的长度就是Lj

UVa 10048 (Floyd变形) Audiophobia

题意: 给一个带权无向图,和一些询问,每次询问两个点之间最大权的最小路径. 分析: 紫书上的题解是错误的,应该是把原算法中的加号变成max即可.但推理过程还是类似的,如果理解了Floyd算法的话,这个应该也很容易理解. 1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 const int maxn = 100 + 10; 6 const int INF = 1000000000; 7 int

【UVa】Jump(dp)

http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4198 约瑟夫变形 根据f(n)=(f(n-1)+m)%n 因为是求倒数第几个 那么我们只要求出f(倒数第几个)的值然后再带进去即可. (没理解的自行面壁..) 而f(倒数第几个)=(m-1)%倒数第几个 然后就行了.. #include <cstdio> #include <

UVA 10935 约瑟夫环

Throwing cards away I Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Description Given is an ordered deck of n cards numbered 1 to n with card 1 at the top and card n at the bottom. The following operation is per

【约瑟夫环变形】UVa 1394 - And Then There Was One

首先看到这题脑子里立刻跳出链表..后来继续看如家的分析说,链表法时间复杂度为O(n*k),肯定会TLE,自己才意识到果然自个儿又头脑简单了 T^T. 看如家的分析没怎么看懂,后来发现这篇自己理解起来更容易(...)共享一下~http://blog.csdn.net/chenguolinblog/article/details/8873444 问题描述:n个人(编号0~(n-1)),从0开始报数,报到(m-1)的退出,剩下的人继续从0开始报数.求胜利者的编号. 编号0~(n-1)是有意义的,因为要