转载自ReverieZH 本人是借鉴于这位大佬的代码而学习的,编写代码是为了让自己进步。

文章介绍了一种算法帮助有选择恐惧症的珊珊决定去哪家商店购物,通过反复排除指定范围内的商店,最终剩下最后一个作为选择。程序使用C++实现,利用动态数组和迭代器操作。

问题 B: 珊珊的选择恐惧症
时间限制: 1 Sec 内存限制: 128 MB
题目描述
珊珊是个喜欢买买买的女孩子,今天她想去商店买衣服,但她有选择恐惧症不知道去哪一家店,于是她想了个办法。她给n个商店编号(编号为 1~n),从第 1 家店开始数,一直数到 m,数到 m 的店不在她的选择范围内,剩下的店再接着从 1 开始数。这样一直重复,最后剩下哪家店,她就去那家店买衣服。你能告诉珊珊她该去编号为多少的店买衣服么?
输入
有多组测试样例
每组测试样例包含两个数字 n 和 m
读到0 0为止
输出
对每个测试样例输出一个店的编码(最后一行除外)
样例输入
4 2
27 8
0 0
样例输出
1
7
 

# include <iostream>
# include <vector>
using namespace std;
vector<int> v;
int main()
{
    int n, m;
    while(1)  //这个代码是为了让程序循环下去,下面有条件能让这个循环跳出来。 
    {
        cin>>n>>m;
        if(n == 0|| m == 0)
        {
            break;   //跳出循环。 
        }
        v.clear();   //这个代码是每次输入n,m的时候,重新会开辟一个动态数组。 
        for(int i = 1; i <= n; i++)
        {
            v.push_back(i);            //这个代码是让v数组往后加值。 
        }
        vector<int> ::iterator it = v.begin();   //定义一个迭代器, 让这个迭代器指向这个动态数组。 
        while(v.size()> 1)  //这个是关键,这个是让数组剩下最后一个元素了,不让他循环了。 
        {
            for(int i = 1; i < m; i++)
            {
                it++;
                if(it == v.end())   //当it指向结尾时, 让it重新返回数组开头。 
                {
                    it = v.begin();
                }
            }
            it = v.erase(it);   //删除it指向当前的元素。 
            if(it == v.end())
            {
                it = v.begin();
            }
        }
        cout<<v.front()<<endl;  //因为数组只剩下最后一个元素了,直接用front输出元素。 
    }
    return 0;
}

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值