约瑟夫环问题和bool类型的应用

1.约瑟夫环问题


令f表示i个人玩游戏报m退出最后胜利者的编号,最后的结果自然是f[n].
递推公式:
f[1]=0;
f=(f[i-1]+m)%i; (i>1)
有了这个公式,我们要做的就是从1-n顺序算出f的数值,最后结果是f[n]。因为实际生活中编号总是从1开始,我们输出f[n]+1由于是逐级递推,不需要保存每个f,程序也是异常简单:
例如:选猴王问题

#include <iostream>
using namespace std;
int main()
{
int m,n;
while(cin>>n>>m&&n!=0&&m!=0)
{
     int *f=new int[n+1];
     f[1]=0;
     for(int i=2;i<=n;i++)
        f[i]=(f[i-1]+m)%i;
     cout<<f[n]+1<<endl;
}
    return 0;
}

 

注:约瑟夫问题还可以用数组(oj上的小孩报数问题)和链表解决。

 

2.bool数组

bool数组元素的值为“true”和“false”,对应着1(或者大于1)和0,用bool数组可以记录其他数组中某值是否出现过,例如:两集合相加问题;

 1 #include <iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     int n,m,a[10000],b[10000],c[20000];
 8 
 9     while(cin>>n>>m)
10     {
11         for(int i=0; i<n; i++)
12         {
13             cin>>a[i];
14             c[i]=a[i];
15         }
16         for(int i=0; i<m; i++)
17         {
18             cin>>b[i];
19             c[n+i]=b[i];
20         }
21         sort(c,c+m+n);
22         int x;
23         bool d[10000]= {0};
24         for(int i=0; i<m+n; i++)
25         {
26             x=c[i];
27             if(d[x]==0)
28                 cout<<x<<" ";
29             d[x]=1;
30         }
31         cout<<endl;
32 
33     }
34     return 0;
35 }

     由于集合元素不能重复,所以要考虑集合{A}和集合{B}的共同元素,记录各元素出现的次数,如果出现过,就不输出;反之输出。

3.bool类型的函数可以用来排序

例如:用sort排序的时候系统默认的是升序排序,若有其他需要(要求降序排列或其他排列方式),此时需用到bool类型函数来定义一个排序方式:如下例

#include <iostream>
#include<algorithm>
using namespace std;

bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int i;
    int a[4];
    for(i=0; i<4; i++)
        cin>>a[i];
    sort(a,a+4,cmp);
    for(i=0; i<4; i++)
        cout<<a[i]<<" ";
    cout<<endl;
    return 0;
}

此例用bool定义了一个比较函数,实现了数组的降序排列。

posted on 2013-08-08 21:50  平心静气  阅读(336)  评论(0)    收藏  举报

导航