题目链接:http://acm.xidian.edu.cn/problem.php?id=1311
先在vector直接储存值的初始位置,用vector来操作数的删除(注意每次删完后面的数都会自己定上来);关于剪枝,本题接近二分操作,复杂度很小,但注意,可以手动直接操作第一次,直接减去偶数位置的数,后面数据就小很多了;
1 #include<stdio.h> 2 #include<vector> 3 using namespace std; 4 5 int main() 6 { 7 int T; 8 vector<int> A; 9 while(scanf("%d",&T) != EOF) 10 { 11 while(T--) 12 { 13 A.clear(); 14 int n; 15 scanf("%d",&n); 16 if(n <= 3) //初始小于三个数做特判 17 { 18 for(int i = 1;i <= n;i++) 19 { 20 if(i == 1) 21 printf("%d",i); 22 else 23 printf(" %d",i); 24 } 25 printf("\n"); 26 continue; 27 } 28 A.push_back(0); 29 int k = 0; 30 for(int i = 1;i <= n;i = 2 * k + 1) //初始放入vector就直接只放奇数 31 { 32 A.push_back(i); 33 k++; 34 } 35 int t = 2; 36 while(1) 37 { 38 if(A.size() <= 4) 39 break; 40 if(t % 2 == 0) 41 { 42 for(int i = 3;i < A.size();i = i + 3) 43 { 44 A.erase(A.begin() + i); 45 i--; 46 } 47 } 48 if(t % 2 != 0) 49 { 50 for(int i = 2;i < A.size();i = i + 2) 51 { 52 A.erase(A.begin() + i); 53 i--; 54 } 55 } 56 t++; 57 } 58 for(int i = 1;i < A.size();i++) 59 { 60 if(i == 1) //依旧是处理空格 61 printf("%d",A[i]); 62 else 63 printf(" %d",A[i]); 64 } 65 printf("\n"); 66 } 67 } 68 return 0; 69 }