乐视2017暑期实习生笔试题(二)

第二题:

传送门

[编程题] 困兽之斗

经过深思熟虑之后,小贱君打算去M国闯一闯,那是一个古老的东方国度,传说有很多高阶魔法师,他想成为一名伟大的魔法师,将来征服星辰大海。
经过千辛万苦,小贱君终于来到了M国,不幸的是刚进城门小贱君就被M国的守城士兵困在了一种叫做“困兽之斗”的阵法之中。
士兵对小贱君说:“看到漂浮在你身边的宝石了吗?彩虹连接的两颗宝石可以任意交换位置,你需要通过一系列交换后使得宝石组成的字符串的字典序最小。若不能破阵,那还是请回吧!”
小贱君观察了一下周围的宝石,只见每颗宝石上标有一个小写字母,而且有一些宝石上通过彩虹与其他宝石相连。
琢磨了半天,他终于搞懂了这个阵法的意思:
若宝石系列为:dcba
其中有两道彩虹,分别是(0,1),(1,2),代表第一个位置上的宝石可以和第二个位置上的宝石互换,第二个位置上的宝石可以和第三个位置上的宝石互换,最终可以得到字典序最小的宝石系列:bcda。
作为小贱君的死党,你有什么方法帮助他破阵吗?

输入描述:

输入包含多组测试数据。
对于每组测试数据:
字符串s --- 代表宝石序列
n --- 代表有n条彩虹
接下来n行,每行两个数ai,bi --- 表示ai和bi由一条彩虹相连。

保证:
1<=s的长度<=10000
1<=n<=10000
且输入数据均合法。

输出描述:

对于每组数据,输出一个字符串

输入例子:
dcba
2
0 1
1 2
hellonowcoder
4
0 1
1 4
2 5
2 3
输出例子:
bcda
ehllonowcoder

思路:并查集 + 排序把能互相连通的字母,进行排序
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<vector>
 4 #include<cstring>
 5 #include<algorithm>
 6
 7 #define N 10005
 8
 9 using namespace std;
10
11 int n;
12 char s[N];
13 int f[N];
14 char ans[N];
15 int l;
16
17 vector<char> v[N];
18 vector<int> pos[N];
19
20 int find(int x){
21     return x == f[x] ? x : f[x] = find(f[x]);
22 }
23
24 void merge(int a,int b){
25     int fa,fb;
26     fa = find(a);
27     fb = find(b);
28     if(fa == fb) return;
29     f[fb] = fa;
30 }
31
32 void ini(){
33     l = strlen(s);
34     scanf("%d",&n);
35     int i;
36     for(i = 0;i < l;i++){
37         f[i] = i;
38         v[i].clear();
39         pos[i].clear();
40     }
41     int a,b;
42     for(i = 1;i <= n;i++){
43         scanf("%d%d",&a,&b);
44         merge(a,b);
45     }
46 }
47
48 void solve(){
49     int i,f;
50     for(i = 0;i < l;i++){
51         f = find(i);
52         pos[f].push_back(i);
53         v[f].push_back(s[i]);
54     }
55     for(i = 0;i < l;i++){
56         sort(v[i].begin(),v[i].end());
57     }
58     for(i = 0;i < l;i++){
59         int sz = pos[i].size();
60         for(int j = 0;j < sz;j++){
61             ans[ pos[i][j] ] = v[i][j];
62         }
63     }
64     ans[l] = ‘\0‘;
65 }
66
67 int main(){
68     while(scanf("%s",s)!=EOF){
69         ini();
70         solve();
71         printf("%s\n",ans);
72     }
73     return 0;
74 }

第三题:

传送门

[编程题]绝域之门

经过多次强攻之后,赫柏带领的军团不仅没能击败鲁卡斯,反而被鲁卡斯打得七零八落,赫柏终于体会到了高阶天之驱逐者的强大实力。
不过,赫柏最终还是找到了鲁卡斯的致命弱点,他发现鲁卡斯喜欢收集上古卷轴,因为上古卷轴能够让鲁卡斯获得神秘之力。
卢卡斯决定使用上古卷轴将卢卡斯引诱到绝域之门,利用绝域之门的力量消灭卢卡斯。
赫柏注意到卢卡斯喜欢收集不同的卷轴,如果总是捡到相同的上古卷轴,它的兴趣就会逐渐降低。
赫柏现在拥有N种不同的卷轴,每种卷轴有Ai个。现在他要将这N个卷轴分散在鲁卡斯领地到绝域之门的路上,每一种排列方式都有一个吸引值Charm,吸引值越高,鲁卡斯被引诱到绝域之门的概率越高。
Charm=Sum of all D(i),其中D(i)=k-i,i为该排列中卷轴i的下标,k为位于i后面且和i是同一种卷轴的卷轴下标。
现在所有的卷轴以<卷轴名称 数量>的格式给出,你需要输出所有卷轴的排列顺序,使得吸引值最大,如果有多种排列方式满足条件,输出按照名字排列字典序最小的一个。

输入描述:
多组测试数据,请处理到文件结束。
对于每组测试数据:
第一行:一个整数N,代表有N种卷轴。
第二行:N种卷轴的描述。
保证:
0<=N<=50;
卷轴名称为长度1~10的字母,每种卷轴的数量为1~800之间的一个整数。
输出描述:
输出所有卷轴的一个排列。
输入例子:
3
Thunder 1 Wind 3 Soil 2
输出例子:
Soil Wind Thunder Wind Soil Wind

题解转自:

每种字符串的吸引值只与它第一次出现和最后一次出现的位置有关,所以我们可以先把所有字符串的首尾出现位置确定,再把其余的字符串塞到中间就行了,安排字符串位置时均按照字典序由小到大的顺序。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<vector>
 5 #include<cstring>
 6 #include<algorithm>
 7
 8 #define N 55
 9
10 using namespace std;
11
12 struct PP{
13     string s;
14     int count;
15 }A[N];
16
17 bool cmp(PP a,PP b){
18     return a.s < b.s;
19 }
20
21 int n;
22 string ans;
23 string l,r,mid;
24
25 void ini(){
26     ans = l = r = mid = "";
27     int i;
28     for(i = 0;i < n;i++){
29         cin >> A[i].s >> A[i].count;
30     }
31 }
32
33 void solve(){
34     sort(A , A + n,cmp);
35     int i;
36     for(i = 0;i < n;i++){
37         if(A[i].count > 1){
38             l += A[i].s + ‘ ‘;
39             r += A[i].s + ‘ ‘;
40             A[i].count -= 2;
41         }
42     }
43     for(i = 0;i < n;i++){
44         while(A[i].count >= 1){
45             mid += A[i].s + ‘ ‘;
46             A[i].count --;
47         }
48     }
49     ans = l + mid + r;
50     if(ans.size() >= 1){
51         ans.pop_back();
52     }
53 }
54
55 int main(){
56     while(scanf("%d",&n)!=EOF){
57         ini();
58         solve();
59         cout<<ans<<endl;
60     }
61     return 0;
62 }
时间: 2024-11-07 01:10:07

乐视2017暑期实习生笔试题(二)的相关文章

笔试题81. 腾讯2017暑期实习生笔试题

今天有点累,不如来个刷个题吧,记得参加腾讯在线笔试的时候遇到过一道题,确实比较懵,所以今天就好好的想了想,这个题来自牛客网... 看到这个图的时候相信大家明白了吧,就是这个题,我一直没有思路,今天突然想起来了,所以就准备解决它.其实这个题主要是运用一个算法思路来解决,最长公共子序列. 仔细想一想,将字符串逆序后与原来的字符串求最长公共子序列不就是这个构造回文吗?这应该很好理解吧,下面简单科普一下最长公共子序列:这中序列不是连续的,意思是可以有间隔,去掉那些干扰项以后,两个序列完全相同,而且要求这

诺基亚(Microsoft Devices Group)2014暑期实习生笔试题知识点

总结一下Microsoft Devices Group的软件类笔试题,所有笔试题分两份试卷,逻辑题一份和软件测试题一份,只总结技术题喽~题目全英文,只包含选择题和填空题,选择题居多,分单选和多选,多选题题目会标注出来.总体来说考察的很基础也很细节,难度适中.下面把记得的一些知识点总结一下下: *命名管道的定义. *主机A发送IP数据报给主机B,途中经过了5个路由器.试问在IP数据报的发送过程总共使用几次ARP(6次) *Linux系统下,给一个文件重命名(mv A,B) *考察无符号整型数和有符

趋势科技2014年暑期实习生笔试题

题目: 有81匹赛马,9个赛道可以利用,每匹赛马的速度是恒定的,不计时但记录每场的名次,请问,赛几次可以得到前5名? 解答: 首先把81匹马分为9组,赛九场,然后把每场的第一名拿出来(刚好9匹),赛一场,得到前五名所在的组(后四名的组果断排除).此时可以确定第一名.然后在第一名的组中抽取2-5名(共四匹马),在第二名的组中抽取2-4名(共三匹马),在第三名的组中抽取2-3(共两匹马),在第四名的组中抽取第2名(共一匹马),此时剩下的马匹有(4+3+2+1+4=14匹),取14中的9匹赛一场,得到

2013年阿里巴巴暑期实习生笔试题--2013年5月5日考试

一.单项选择题 1.下列说法错误的是: A.SATA硬盘的速度大约为500Mbps/s B.读取18XDVD光盘数据的速度为1Gbps C.千兆以太网的数据读取速度为1Gpbs D.读取DDR3内存数据的速度为100Gbps 分析:A和B相比,怎么光盘的速度比硬盘还快?B必错无疑啊.千兆以太网的速度是1000Mbps,也可以写成1Gbps.DDR3-1600的极限传输速度是12.8GBp/s 2.()不能用于Linux中的进程通信 A.共享内存 B.命名管道 C.信号量 D.临界区 分析:Lin

算法面试题-今日头条2017客户端工程师实习生笔试题4:或与加

今日头条2017客户端工程师实习生笔试题 题目: 这个题做到最后,时间不是很够,题目内容比较简单,求出第k个正整数符合x+y=x|y,然而这个k的取值范围非常大(k<=2000000000),所以可以不用考虑穷举法,当然,时间不够的话写个穷举试试运气也可以. 穷举法: 1 import java.util.Scanner; 2 3 /** 4 * Created by Administrator on 2016/9/6. 5 */ 6 7 public class Main { 8 public

今日头条2017后端工程师实习生笔试题 - 题解

今日头条2017后端工程师实习生笔试题 最大映射 题意 给n(不超过50)个字符串,每个字符串(长度不超过12)由A-J的大写字符组成.要求将每个字符映射为0-9,使得每个字符串可以看作一个整数(不能有前导零),求这些字符串映射后得到数字的最大和值.(数据保证至少有一个字符不是任何字符串的首字母) 思路 根据字符所在的位置,累积统计每个字符的权值,从右到左权值分别为1, 10, 100, 1000..... 然后排序,从权值最小的到权值最大的依次映射为0-9,求和即为答案. 注意 由于每个字符串

2014.3.29阿里巴巴暑期实习笔试题分析

参考:http://blog.csdn.net/iloveyoujelly/article/details/22941531 下面中的[分析]是我给出的. 2014.3.29阿里巴巴暑期实习笔试题分析 一.单选 1.假设一个主机ip为192.168.5.121,子网掩码为255.255.255.248,则该主机的网络号部分(包括子网号部分)为-- A.192.168.5.12  B 192.168.5.121   C 192.168.5.120   D 192.168.5.32 参考答案 C [

某支付公司笔试题二

题目:用java编写一段程序采用选择排序法对数组array = {25,15,42,16,12,36}进行由小到大排序. 1.选择排序法 该排序法的思想是每次从当前元素开始往后查找最小元素,将最小与当前元素进行位置互换.选择排序和冒泡排序相比优势在于交换次数减少. // 时间复杂度n(n-1)/2,即O(n^2) public static void selectSort(int[] array){ int k,tmp,len; len=array.length; for(int i=0;i<l

腾讯暑期实习笔试题 有趣的梅式砝码问题

无意间看到这样的一个题目,题目内容是: 用4个砝码称出1到40的重量的物体,这四个砝码的重量分别是多少?? 此处有一点必须注意,很多人一拿到题目(包括我自己),一下子就想到了二进制的解法,可是立刻就发现,二进制的40需要的位数大于4位,也就是说不靠谱. 更加值得注意的是,二进制的方法用在此处,相当于只是将砝码做加法,并未考虑减法,见过天平的同学都知道,砝码是可以和物体放在一边的.因此是可以做减法的. 看了大多数人的题解,提到了,这是一个"梅式砝码"的问题,首先:作出如下假设:(有点类似