2021-4-09
http://tjuacm.chaosheng.top/problem.php?id=1249
http://acm.hdu.edu.cn/showproblem.php?pid=1276
这个题测试用例输出的一样但是WA。
更新:发现原因了,问题出在3个数的排序,它满足样例,但是输入4顺序就不对了。
再次更新!不是顺序问题,是对题目的理解有问题。他是每次都要出队都要从第一个测试到最后一个,而不是达到三个就结束!!所以输入4得到的不是1 3 4而是1 3。
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int N = 5000; //bool out[N]; int main(){ int n, m; cin >> n; while(n--){ cin >> m; queue<int> num; for(int i = 0; i < m; i++){ num.push(i); } int casen = 0; int t = 0; while(num.size() > 3){ int tmp = num.front(); t++; if(tmp == 1){ t = 1; casen++; num.pop(); num.push(tmp); }else{ if(casen % 2 == 1 && t % 2 == 0){ //报数2 num.pop(); }else if(casen % 2 == 0 && t % 3 == 0){ //报数3 num.pop(); }else{ num.pop(); num.push(tmp); } } } int tmp = num.front(); num.pop(); num.push(tmp); //输出第一个 cout << num.front(); num.pop(); while(!num.empty()){ cout << " " << num.front(); num.pop(); } cout << endl; } return 0; }
更改后的代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <queue> using namespace std; const int N = 5000; int ans[3]; int main(){ int n, m; cin >> n; while(n--){ cin >> m; queue<int> num; for(int i = 1; i <= m; i++){ num.push(i); } int casen = 1; while(num.size() > 3){ int x = num.size(); //当前人数 if(casen % 2 == 1){ //2 for(int i = 0; i < x/2; i++){ num.push(num.front()); //把第奇数个数压回队列 num.pop(); //把第奇数个数弹出 num.pop(); //把第偶数个数回队列 } if(x % 2 == 1){ //剩最后一个没有回到队尾 num.push(num.front()); num.pop(); } }else{ for(int i = 0; i < x/3; i++){ num.push(num.front()); //把第1数个数压回队列 num.pop(); //把第1数个数弹出 num.push(num.front()); //把第2数个数压回队列 num.pop(); //第2个数弹出 num.pop(); //第3个数弹出 } while(x % 3 != 0){ //最后有数没有回到队尾 num.push(num.front()); num.pop(); x--; } } casen++; } while(num.size() != 1){ printf("%d ", num.front()); num.pop(); } printf("%d\n", num.front()); num.pop(); } return 0; }
2021-5-17
自己再写了一次
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int N = 5010; queue<int> q; int main(){ int t, n, m; cin >> t; while(t--){ cin >> n; //while(!q.empty()) q.pop(); queue<int> q; for(int i = 1; i <= n; i++){ q.push(i); } int way = 0; int k; while(q.size() > 3){ int len = q.size(); if(way % 2 == 0){ k = 1; while(k <= len){ if(k % 2 == 0){ q.pop(); }else{ int tmp = q.front(); q.pop(); q.push(tmp); } k++; } } if(way % 2 == 1){ k = 1; while(k <= len){ if(k % 3 == 0){ q.pop(); }else{ int tmp = q.front(); q.pop(); q.push(tmp); } k++; } } way++; } while(q.size() != 1){ cout << q.front() << " "; q.pop(); } cout <<q.front() << endl; } return 0; }