科大讯飞笔试题_杀手

题目:

  有n个杀手排成一行,每个杀手都有一个不同的编号(编号1-n),在每个夜晚,杀手都会行动,如果某个杀手编号大于他右边的杀手的编号,他就会杀死他右边的杀手,杀手的行动是瞬间的,因此一个人可能某一个夜晚既杀死了别人,又被别人杀死,例如3,2,1这个顺序,在第一个夜晚2会杀死1,同时,3会杀死2,显而易见,一段时间后,就不会有人被杀系,平安夜就到来了,请问在平安夜之前有多少个夜晚。

输入:

  输入第一行是一个整数n(1<=n<=100000),表示杀手的数量;

  接下来一行有n个数,是一个1-n的全排列。

输出:

  输出包好一个整数,表示平安夜之前经历了多少个夜晚;

样例输入:

  10

  10  9   7  8  6  5  3  4  2  1

样例输出:

  2

样例解释:

  杀手额变化为:[10 9 7 8 6 5 3 4 2 1]---->[10 8 4]---->[10],所以答案是2

思路:

  循环判断,左边的杀手大于右边的杀手即将右边的杀手杀死,同时i将杀死的杀手做以记录,用于下一循环的比较左值, 知道某一循环没有人被杀死,循环结束。

实现:

 1 #include <bits/stdc++.h>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct Node
 6 {
 7     int val;
 8     Node* next;
 9     Node(int vl) : val(vl), next(NULL) {}
10 };
11 
12 int main()
13 {
14     int n, num;
15     cin >> n;
16     cin >> num;
17     Node* head = new Node(num);
18     Node *last = head, *temp;
19     for (int i = 1; i < n; i++)
20     {
21         cin >> num;
22         temp = new Node(num);
23         last->next = temp;
24         last = temp;
25     }
26 
27     int killed = 0, ret = 0;
28     do
29     {
30         killed = 0;
31         Node *first = head, *second = head->next;
32         int lastKilled = 0;
33         while (second != NULL)
34         {
35             if (lastKilled != 0)
36             {
37                 if (lastKilled > second->val)
38                 {
39                     lastKilled = second->val;
40                     second = second->next;
41                     delete first->next;
42                     first->next = second;
43                     killed++;
44                 }
45                 else
46                 {
47                     lastKilled = 0;
48                     first = second;
49                     second = second->next;
50                 }
51             }
52             else if (first->val > second->val)
53             {
54                 lastKilled = second->val;
55                 second = second->next;
56                 delete first->next;
57                 first->next = second;
58                 killed++;
59             }
60             else
61             {
62                 first = second;
63                 second = second->next;
64             }
65         }
66         ret++;
67     } while (killed > 0);
68 
69     cout << ret - 1;
70 }
专注搬砖,擅长搬砖砸自己的脚~~~ Email: ltwbuaa@163.com
原文地址:https://www.cnblogs.com/TonvyLeeBlogs/p/9607951.html