洛谷 P1145 约瑟夫

题目描述

n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人。现在有一圈人,k个好人站在一起,k个坏人站在一起。从第一个好人开始数数。你要确定一个最小的m,使得在第一个好人被杀死前,k个坏人先被杀死。

感谢yh大神指出样例数据的错误。

输入输出格式

输入格式:

一个k,0<k<14

输出格式:

一个m

输入输出样例

输入样例#1:

3

输出样例#1:

5

输入样例#2:

4

输出样例#2:

30

说明

0<k<14

屠龙宝刀点击就送

70分环形队列

#include <cstdio>
int k,next[30];
bool check(int m)
{
    int pos=2,gs=0,j=1,sum=0;
    for(;gs<k*2;)
    {
        for(;pos<m;pos++) j=next[j];
        if(next[j]>k) sum++;
        if(next[j]<=k&&sum<k) return false;
        if(next[j]<=k&&sum==k) return true;
        pos=1;gs++;next[j]=next[next[j]];
    }
}
int main()
{
    scanf("%d",&k);
    for(int i=1;i<k*2;++i) next[i]=i+1;
    next[k*2]=1;
    for(int i=k+1;;++i)
    {
        if(check(i))
        {
            printf("%d",i);
            return 0;
        }
        for(int i=1;i<k*2;++i) next[i]=i+1;next[k*2]=1;
    }
    return 0;
}

ATAATAAAAT

AC代码

#include <cstdio>
int flag,ans,now,k;
bool check(int Remain)
{
    int nextt=(now+ans-1)%Remain;
    if(nextt>=k) {now=nextt;return 1;}
    else return 0;
}
int main()
{
    scanf("%d",&k);
    for(ans=k+1;!flag;++ans)
    {
        now=0;flag=1;
        for(int i=0;i<k;++i)
         if(!check(2*k-i)) {flag=0;break;}
    }
    printf("%d\n",ans-1);
    return 0;
}
时间: 2024-08-28 12:09:38

洛谷 P1145 约瑟夫的相关文章

洛谷P1145 约瑟夫 数学

洛谷P1145 约瑟夫   数学 在做这题之前最好先做一下普通的约瑟夫问题 普通的约瑟夫问题  有一种递推的做法,比如说  12345 五个数,删掉3  之后,那你就把4编号改成3   5改成4,然后继续做就行了,但是后来这样求出的编号并不是其真实的编号,而是虚的编号 然后这道题如果前k个一直没被删,那么被删除的编号一定是大于 k 的, 这样做下去一直判断下去就行了,因为要mod 然后重新编号有些麻烦,所以还是坐标还是从0开始方便安全 1 #include<cstdio> 2 using na

洛谷P1145 约瑟夫

题目描述 n个人站成一圈,从某个人开始数数,每次数到m的人就被杀掉,然后下一个人重新开始数,直到最后只剩一个人.现在有一圈人,k个好人站在一起,k个坏人站在一起.从第一个好人开始数数.你要确定一个最小的m,使得在第一个好人被杀死前,k个坏人先被杀死. 感谢yh大神指出样例数据的错误. 输入输出格式 输入格式: 一个k,0<k<14 输出格式: 一个m 输入输出样例 输入样例#1: 3 输出样例#1: 5 输入样例#2: 4 输出样例#2: 30 说明 0<k<14 分析:正解就是暴

洛谷 P1996 约瑟夫问题

题目背景 约瑟夫是一个无聊的人!!! 题目描述 n个人(n<=100)围成一圈,从第一个人开始报数,数到m的人出列,再由下一个人重新从1开始报数,数到m的人再出圈,……依次类推,直到所有的人都出圈,请输出依次出圈人的编号. 输入输出格式 输入格式: n m 输出格式: 出圈的编号 输入输出样例 输入样例#1: 10 3 输出样例#1: 3 6 9 2 7 1 8 5 10 4 说明 你猜,你猜,你猜猜猜...... 猜不着吧,我也不告诉你!!! 屠龙宝刀点击就送 #include <cstdi

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3

洛谷1231 教辅的组成

洛谷1231 教辅的组成 https://www.luogu.org/problem/show?pid=1231 题目背景 滚粗了的HansBug在收拾旧语文书,然而他发现了什么奇妙的东西. 题目描述 蒟蒻HansBug在一本语文书里面发现了一本答案,然而他却明明记得这书应该还包含一份练习题.然而出现在他眼前的书多得数不胜数,其中有书,有答案,有练习册.已知一个完整的书册均应该包含且仅包含一本书.一本练习册和一份答案,然而现在全都乱做了一团.许多书上面的字迹都已经模糊了,然而HansBug还是可

洛谷教主花园dp

洛谷-教主的花园-动态规划 题目描述 教主有着一个环形的花园,他想在花园周围均匀地种上n棵树,但是教主花园的土壤很特别,每个位置适合种的树都不一样,一些树可能会因为不适合这个位置的土壤而损失观赏价值. 教主最喜欢3种树,这3种树的高度分别为10,20,30.教主希望这一圈树种得有层次感,所以任何一个位置的树要比它相邻的两棵树的高度都高或者都低,并且在此条件下,教主想要你设计出一套方案,使得观赏价值之和最高. 输入输出格式 输入格式: 输入文件garden.in的第1行为一个正整数n,表示需要种的

洛谷 P2801 教主的魔法 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=2801 题目描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.…….N. 每个人的身高一开始都是不超过1000的正整数.教主的魔法每次可以把闭区间[L, R](1≤L≤R≤N)内的英雄的身高全部加上一个整数W.(虽然L=R时并不

洛谷P1466 集合 Subset Sums

洛谷P1466 集合 Subset Sums这题可以看成是背包问题 用空间为 1--n 的物品恰好填充总空间一半的空间 有几种方案 01 背包问题 1.注意因为两个交换一下算同一种方案,所以最终 要 f [ v ] / 2 2.要开 long long 1 #include <cstdio> 2 #include <cstdlib> 3 #include <cmath> 4 #include <cstring> 5 #include <string&g

洛谷P1160 队列安排 链表

洛谷P1160 队列安排   链表 1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <cstdlib> 5 #include <string> 6 #include <algorithm> 7 #include <iomanip> 8 #include <iostream> 9 using namespace std