华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1161|回复: 2
打印 上一主题 下一主题

P1145 约瑟夫

[复制链接]

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
跳转到指定楼层
楼主
发表于 2018-10-15 08:26:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1145

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

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

输入输出格式
输入格式:
一个k(0<k<14)
输出格式:
一个m
输入输出样例
输入样例#1:
3
输出样例#1:
5
输入样例#2:
4
输出样例#2:
30
说明
0<k<14
回复

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
沙发
 楼主| 发表于 2020-7-11 08:26:10 | 只看该作者
题目的规模不大,k才14,我们用最直观的模拟穷举大法来做,复习下标准的约瑟夫:
  1. #include<iostream>
  2. using namespace std;
  3. int a[10];
  4. int i,s,j;
  5. int main()
  6. {
  7.         int m=8,n=5;
  8.         for (i=1; i<=m; i++) a[i]=1; ///初始都在圈内
  9.         i=s=j=0;
  10.         while (j<=m-1)
  11.                 {
  12.                         i++;
  13.                         if (i>m) i=1;///围圈
  14.                         s=s+a[i];///报数
  15.                         if (s==n)
  16.                                 {
  17.                                         a[i]=0;//出圈
  18.                                         s=0;
  19.                                         cout<<i<<' ';
  20.                                         j++;///+1
  21.                                 }
  22.                 }
  23.         
  24.         return 0;
  25. }
  26. /// m=8 n=5 k=3
复制代码


我们这个m=2k,不需要所有的人都出去,只需要出去k个人就可以了,所以第10行while(j<=m-1)就应该是j<=k-1,
在while退出州我们加一段代码检测是否都符合条件:看看前面k个人,就是1-k是否还在圈内,这个可以最直观的通过计算a1到ak的和是否等于k来判断,
然后类似反约瑟夫,枚举n,显然,n不可能<=k,想想为什么,(若n<k,则第一个出去的人的序号肯定小于k)
回复 支持 反对

使用道具 举报

738

主题

1485

帖子

5420

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5420
板凳
 楼主| 发表于 2020-7-11 13:06:22 | 只看该作者
这么做交上去只对了三组,其他的都是潮超时
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-11-2 02:22 , Processed in 0.258658 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表