科大讯飞笔试题_杀手

题目:

  有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 }

原文地址:https://www.cnblogs.com/TonvyLeeBlogs/p/9607951.html

时间: 2024-08-30 09:24:57

科大讯飞笔试题_杀手的相关文章

003_C/C++笔试题_分享大汇总

(一)感谢:lhzstudio 01_C++经典面试题全集 50~100道 都附带有参考答案 02_C++开发工程师面试题库 100~150道 03_C++笔试题库之编程.问答题 150~200道 04_C++笔试题库之编程.问答题 200~300道 原文地址:https://www.cnblogs.com/luxiaoguogege/p/9786873.html

2015小米暑期实习笔试题_懂二进制(位运算)

总共3道题,最后一道还没AC出来... 世界上有10种人,一种懂二进制,一种不懂. 那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子: 1999 2299 输出例子: 7 此题解法类似于<编程之美>上面看到的某题 代码: #include <iostream> using namespace std; int countBitDiff(int m, int n) { int sum=0; for(int i=0;i<32;i++) if(

2015小米暑期实习笔试题_风口的猪-中国牛市(dp)

风口之下,猪都能飞.当今中国股市牛市,真可谓"错过等七年". 给你一个回顾历史的机会,已知一支股票连续n天的价格走势,以长度为n的整数数组表示,数组中第i个元素(prices[i])代表该股票第i天的股价. 假设你一开始没有股票,但有至多两次买入1股而后卖出1股的机会,并且买入前一定要先保证手上没有股票.若两次交易机会都放弃,收益为0. 设计算法,计算你能获得的最大收益. 输入数值范围:2<=n<=100,0<=prices[i]<=100 输入例子: 3,8,

微软公司笔试题_附上源码解决

第一道题 # -*- coding: utf-8 -*- ''' f(a*b, acb) => true f(abc*, abbc) => false f(**bc, bc) => true ''' import re string='abbc' Regex = re.compile(r'(abc)*') def f(Regex,string): mo = Regex.search(string) if mo.group()!='': return True else: return F

网易笔试题_塔的最小不稳定性

原题不再赘述,大概就是这么个意思: 输入n个数(均大于0)以及可以对这n个数进行操作的最多次数,每次操作将n个数中最大值-1,最小值+1,计算进行这样的操作后数组中(最大值-最小值)的最小值. java简单实现(暴力解) 1 package interview.test; 2 3 import java.util.*; 4 5 /** 6 * Created by BUAA514 on 2018-08-11. 7 */ 8 public class Main { 9 10 /** 11 * 题目

迅雷笔试题_素勾股数的个数

题目: 勾股数,是由三个正整数组成的数组:能符合勾股定理 a*a + b*b = c*c ,(a, b, c) 的正整数解.如果 (a, b, c) 是勾股数,它们的正整数倍数,也是勾股数.如果 (a, b, c) 互质,它们就称为素勾股数.给定正整数N, 计算出小于或等于N的素勾股数个数. 样例输入: 10 样例输入: 1 思路: 产生素勾股数的方式: 设m > n .m 和n 均是正整数, a=m2-n2 b=2mn c= m2+n2 若m 和n 是互质,而且m 和n 其中有一个是偶数,计算

002_C/C++笔试题_简单算法程序

(一)冒泡排序法 1 #include <iostream> 2 using namespace std; 3 void bubblesort(int a[], int m); 4 int main(void) 5 { 6 int i; 7 int array[]={5,4,8,44,56,4,5,9}; 8 bubblesort(array,sizeof(array)/4);/*sizeof(array)/4,取长度,int类型是4字节*/ 9 /*打印已经排序的数组*/ 10 for(i

Java工程师笔试题整理[校招篇]

隔着两个月即将开始校招了.你是不是也想借着这个机会崭露头角,拿到某些大厂的offer,赢取白富美.走上人生巅峰?当然如果你还没能打下Java基础,一定要先打好Java基础:如何一步一步的学Java - 学习编程 - 知乎专栏.然后再来看一下练习一下各大厂的面试笔试题目. 如果以下内容满足不了你,你还可以去看这篇: 2016校招编程题汇总 - 学习编程 - 知乎专栏 进入主要内容(主要内容整理来自牛客网:牛客网)(以下内容按照各大公司进行划分,对每一公司按照年份进行划分,如果想想下载以下内容,可以

2014阿里巴巴WEB前端实习生在线笔试题

2014年3月31日晚,我怀着略微忐忑的心情(第一次在线笔试^_^!!)进行了笔试,阿里巴巴的笔试题共有10道,几乎包含了Web前端开发的各个方面,有程序题.有叙述题,时间非常紧张,只完成了大概6道题.下面把遇到的题目跟大家分享一下! 1. <pre name="code" class="html"><!doctype html> <html> <head> <style type="text/css&