• 蓝桥杯 试题 算法提高 书院主持人


    资源限制
    时间限制:1.0s   内存限制:256.0MB
    问题描述
      北大附中书院有m个同学,他们每次都很民主地决策很多事情。按罗伯特议事规则,需要一个主持人。同学们民主意识强,积极性高,都想做主持人,当然主持人只有一人。为了选出主持人,他们想到了一个办法并认为很民主。方法是:
      大家围成一圈,从1到m为每个同学编号。然后从1开始报数, 数到n的出局。剩下的同学从下位开始再从1开始报数。最后剩下来的就是主持人了。现在已经把同学从1到m编号,并约定报数为n的出局,请编程计算一下,哪个编号的同学将会成为主持人。
    输入格式
      一行,由空格分开的两个整数m n。
    输出格式
      一个整数,表示主持人的编号
    样例输入
    15 3
    样例输出
    5
    样例输入
    200 55
    样例输出
    93
    数据规模和约定
      10000>m>0; 100>n>0;

     
    总结:
    这个ans变量的定义不能省,开始的时候我直接是用i变量作为输出答案,可是由于最后还有遍历if(i==m)这个语句的判断才会出循环,改变正确答案,因此我定义了一个ans变量,直接记录答案,并每次更新,而不修改。
     
    代码:
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    int main(){
        int m,n;
        cin>>m>>n;
        int a[m+1];
        for(int i=1;i<=m;i++){
            a[i] = i;
        } 
        int cnt = m;
        int i=0;
        int k = 0;
        int ans = 0;
        while(cnt){
            i++;
            if(a[i]) k++;
            if(k==n){
                if(a[i]!=0){
                    a[i] = 0;
                    cnt--;
                    ans = i;
                }
                k = 0;        
            }
            if(i==m) i = 0;
        }
        cout<<ans<<endl;
        return 0;
    }

     

    约瑟夫方法:

    #include<iostream>
    using namespace std;
    int m,n; 
    int f(int n, int m){
        return n == 1 ? n : (f(n - 1, m) + m - 1) % n + 1;
    }
    int main(){
        cin>>m>>n;
        cout<<f(m,n)<<endl;
        return 0;
    }
  • 相关阅读:
    DevExpress 学习链接
    DevExpress TreeList用法总结
    DevExpress 用户控件 分页(中)
    DevExpress通过girdcontrol实现分页
    DevExpress 操作gridcontrol
    通过c#操作word文档的其他方式
    DocX操作word生成报表
    数学文化 剩余定理
    数学文化 卢卡斯数列和黄金分割
    mac 终端高亮显示~
  • 原文地址:https://www.cnblogs.com/lusiqi/p/12517268.html
Copyright © 2020-2023  润新知