|
沙发
楼主 |
发表于 2020-7-11 08:26:10
|
只看该作者
题目的规模不大,k才14,我们用最直观的模拟穷举大法来做,复习下标准的约瑟夫:
- #include<iostream>
- using namespace std;
- int a[10];
- int i,s,j;
- int main()
- {
- int m=8,n=5;
- for (i=1; i<=m; i++) a[i]=1; ///初始都在圈内
- i=s=j=0;
- while (j<=m-1)
- {
- i++;
- if (i>m) i=1;///围圈
- s=s+a[i];///报数
- if (s==n)
- {
- a[i]=0;//出圈
- s=0;
- cout<<i<<' ';
- j++;///+1
- }
- }
-
- return 0;
- }
- /// 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) |
|