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

被折叠的 条评论
为什么被折叠?



