B: Twilight的卡牌游戏

题目链接: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 }

猜你喜欢

转载自www.cnblogs.com/Dicer/p/9100843.html