UVa133 - The Dole Queue

来源:互联网 发布:如何利用网络学英语 编辑:程序博客网 时间:2024/05/22 13:11

题意:给出一个数组,分别从1和N开始数k,m,然后将选中的数删除,继续直到数组长度为0

思路:主要是用stl中的list

代码如下:

#include <iostream>#include <fstream>#include <list>#include <iomanip>using namespace std;void solve(int n, int k, int m);int main(){#ifndef ONLINE_JUDGEifstream fin("F:\\OJ\\uva_in.txt");streambuf *old = cin.rdbuf(fin.rdbuf());#endifint n, k, m;while (cin >> n >> k >> m){if (n == 0 && k == 0 && m == 0) break;solve(n, k, m);}#ifndef ONLINE_JUDGEcin.rdbuf(old);#endifreturn 0;}void solve(int n, int k, int m){list<int> l;for (int i = 1; i <= n; i++){l.push_back(i);}list<int>::iterator kit = l.begin(), mit = --l.end();while (l.size() != 0){for (int i = 1; i < k; i++){kit++;if (kit == l.end()) kit = l.begin();}for (int i = 1; i < m; i++){mit--;if (mit == l.end()) mit = --l.end();}if (*kit == *mit){cout << setw(3) << right << *kit;kit = l.erase(kit);if (kit == l.end()) kit = l.begin();mit = kit;mit--;if (mit == l.end()) mit = --l.end();if (l.size() != 0) cout << ",";}else{cout << setw(3) << right << *kit << setw(3) << right << *mit;list<int>::iterator it = kit;it++; if (it == l.end()) it = l.begin();if (it == mit){mit = l.erase(mit);if (mit == l.end()) mit = --l.end();kit = l.erase(kit);if (kit == l.end()) kit = l.begin();mit--;if (mit == l.end()) mit = --l.end();}else{kit = l.erase(kit);if (kit == l.end()) kit = l.begin();mit = l.erase(mit);if (mit == l.end()) mit = --l.end();else                {                    mit--;                    if (mit == l.end()) mit = --l.end();                }}if (l.size() != 0) cout << ",";}}cout << endl;}

0 0
原创粉丝点击