这个问题的算法怎么实现?

维罗妮卡决定去死 2014-09-03 09:12:26
昨天晚上老爸给我买了一盒月饼,我拿上楼去准备一边看电影一边吃,月饼一共是6个,看起来都很好吃的样子,于是我就开始“点名点到吃哪个”,好第一个是绿豆月饼。吃完后,我准备吃第二个,于是我又点名了一遍,选出了第二个月饼。于是我在想啊,用什么算法可以给出一个我吃月饼的顺序(始终用点名点到的方法),直到吃完为止。我动手用C++写了一下,没写成功,希望大家帮帮忙。这里规定下,月饼数为N,而且有所谓的首月饼(不是首尾相连的),点名点到口诀长度为整数Round,要求输出依次吃的月饼的整个顺序。用C,C++,java皆可。

解决了我请你吃月饼
...全文
178 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 8 楼 mujiok2003 的回复:
[quote=引用 7 楼 qq_17270753 的回复:] [quote=引用 6 楼 lovesmiles 的回复:] vector<string> Mooncake(6); Mooncake[0] = "绿豆"; Mooncake[1] = "双黄"; Mooncake[2] = "莲蓉"; Mooncake[3] = "冰皮"; Mooncake[4] = "伍仁"; Mooncake[5] = "叉烧"; int Round =111;//这是点名的长度,随你设置 for(int i=0;i<6;i++)//吃6个 { int Index = Round %Mooncake.size(); cout<<"第“<<i<<"次吃"<<Mooncake[Index]<<endl; Mooncake.erase(Mooncake.begin()+Index);//吃完了,把它删掉 }
其实我主要是在想如果月饼数是N个,动态的时候该怎么求解。不过多亏你我知道剩下几个该怎么吃了,谢谢。[/quote] vector支持动态push_back的。

int N; 
if(std::cin >.> N && N > 0){
   vector<string> cakes(N);
    for(int i = 0; i < N; i++){
          cin >> cakes[i];
    }
    ....
}
[/quote] 谢谢你这么耐心
  • 打赏
  • 举报
回复
这样的问题很简单了,自己好好想想,尽量自己写把
赵4老师 2014-09-03
  • 打赏
  • 举报
回复
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
    while (1) {
        printf("Input n m(1000>=n>=m>=1):");
        fflush(stdout);
        rewind(stdin);
        if (2==scanf("%d%d",&n,&m)) {
            if (1000>=n && n>=m && m>=1) break;
        }
    }
    t=0;//已出圈总人数
    i=1;//座位编号
    k=1;//当前要数的数
    while (1) {
        if (0==f[i]) {
            if (m==k) {
                t++;
                f[i]=1;
                printf("%3d ",i);
                if (0==t%10) printf("\n");
                if (t>=n) break;
            }
            k++;if (k>m) k=1;
        }
        i++;if (i>n) i=1;
    }
    cprintf("Press any key ...");
    getch();
}
mujiok2003 2014-09-03
  • 打赏
  • 举报
回复
引用 7 楼 qq_17270753 的回复:
[quote=引用 6 楼 lovesmiles 的回复:] vector<string> Mooncake(6); Mooncake[0] = "绿豆"; Mooncake[1] = "双黄"; Mooncake[2] = "莲蓉"; Mooncake[3] = "冰皮"; Mooncake[4] = "伍仁"; Mooncake[5] = "叉烧"; int Round =111;//这是点名的长度,随你设置 for(int i=0;i<6;i++)//吃6个 { int Index = Round %Mooncake.size(); cout<<"第“<<i<<"次吃"<<Mooncake[Index]<<endl; Mooncake.erase(Mooncake.begin()+Index);//吃完了,把它删掉 }
其实我主要是在想如果月饼数是N个,动态的时候该怎么求解。不过多亏你我知道剩下几个该怎么吃了,谢谢。[/quote] vector支持动态push_back的。

int N; 
if(std::cin >.> N && N > 0){
   vector<string> cakes(N);
    for(int i = 0; i < N; i++){
          cin >> cakes[i];
    }
    ....
}
  • 打赏
  • 举报
回复
引用 6 楼 lovesmiles 的回复:
vector<string> Mooncake(6); Mooncake[0] = "绿豆"; Mooncake[1] = "双黄"; Mooncake[2] = "莲蓉"; Mooncake[3] = "冰皮"; Mooncake[4] = "伍仁"; Mooncake[5] = "叉烧"; int Round =111;//这是点名的长度,随你设置 for(int i=0;i<6;i++)//吃6个 { int Index = Round %Mooncake.size(); cout<<"第“<<i<<"次吃"<<Mooncake[Index]<<endl; Mooncake.erase(Mooncake.begin()+Index);//吃完了,把它删掉 }
其实我主要是在想如果月饼数是N个,动态的时候该怎么求解。不过多亏你我知道剩下几个该怎么吃了,谢谢。
勤奋的小游侠 2014-09-03
  • 打赏
  • 举报
回复
vector<string> Mooncake(6); Mooncake[0] = "绿豆"; Mooncake[1] = "双黄"; Mooncake[2] = "莲蓉"; Mooncake[3] = "冰皮"; Mooncake[4] = "伍仁"; Mooncake[5] = "叉烧"; int Round =111;//这是点名的长度,随你设置 for(int i=0;i<6;i++)//吃6个 { int Index = Round %Mooncake.size(); cout<<"第“<<i<<"次吃"<<Mooncake[Index]<<endl; Mooncake.erase(Mooncake.begin()+Index);//吃完了,把它删掉 }
勤奋的小游侠 2014-09-03
  • 打赏
  • 举报
回复
vector<string> Mooncake(6); Mooncake[0] = "绿豆"; Mooncake[0] = "绿豆"; Mooncake[0] = "绿豆"; Mooncake[0] = "绿豆";
xiaohuh421 2014-09-03
  • 打赏
  • 举报
回复
这不就是一个排列组合问题吗? 我的理解. N选1, 再N-1选1, 直到最后.
freecodex 2014-09-03
  • 打赏
  • 举报
回复
freecodex 2014-09-03
  • 打赏
  • 举报
回复
模型是约瑟夫环问题,网上搜下,有很多思路

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧