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;
}
京公网安备 11010502036488号