2017网易有道校园招聘笔试题

 

 

分析题目可以发现原始序列和之后的序列有一个对应关系。 比如队列的第二个数是第一个被输出的,所以输出是 1 2 ... n的话,对应的第二个数就是1 依次内推。我们可以从之后的序列出发进行同样的操作然后做个对应关系的映射还原回原始的序列

 

复制代码
 1 #include "iostream"
 2 #include "queue"
 3 #define N 100005
 4 
 5 using namespace std;
 6 
 7 int n, a[N], b[N];
 8 
 9 int main() {
10     int t;
11     cin >> t;
12 
13     while (t--) {
14         cin >> n;
15         queue<int> q;
16         for (int i = 1; i <= n; i++)
17             q.push(i);
18 
19         int cnt = 0;
20 
21         while (!q.empty()) {
22             int x = q.front();
23             q.pop();
24             q.push(x);
25             x = q.front();
26             a[++cnt] = x;
27             q.pop();
28         }
29 
30         for (int i = 1; i <= n; i++)
31             b[a[i]] = i;
32 
33         for (int i = 1; i < n; i++)
34             cout << b[i] << " ";
35         cout << b[n];
36         cout << endl;
37     }
38     return 0;
39 }
复制代码

 

 

 

再开一个数组,模拟下,暴力就过了:

复制代码
 1 #include "iostream"
 2 #define MAX 201
 3 typedef long long LL;
 4 
 5 using namespace std;
 6 
 7 int n, k;
 8 LL a[MAX], b[MAX];
 9 void solve(LL *a)
10 {
11     for (int i = 1; i <= 2*n; i++)
12     {
13         if (i <= n)
14         {
15                 b[2 * i - 1] = a[i];
16         }
17         else
18                 b[2 * (i - n)] = a[i];    
19     }
20     for (int i = 1; i <= 2 * n; i++)
21     {
22         a[i]=b[i];
23     }
24 }
25 
26 int main()
27 {
28     int t;
29 
30     cin >> t;
31     while (t--)
32     {
33         cin >> n >> k;
34         for (int i = 1; i <= 2 * n; i++)
35             cin >> a[i];
36 
37         while (k)
38         {
39             solve(a);
40             k--;
41         }
42 
43         for (int i = 1; i < 2 * n; i++)
44         {
45             cout << a[i] << " ";
46         }cout<<a[2*n];
47         cout << endl;
48     }    
49 }
复制代码

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值