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

来源:互联网 发布:近反义词查询软件 编辑:程序博客网 时间:2024/05/02 01:59

 

 

分析题目可以发现原始序列和之后的序列有一个对应关系。 比如队列的第二个数是第一个被输出的,所以输出是 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         else18                 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 0
原创粉丝点击