1、Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁
如:N=8: ABCDAABB,第八个人是B,
分析:
这个问题相当每次翻倍,要看第N个人喝饮料的是谁,就要知道这是第几(i)轮喝饮料,然后减去前几轮所有喝的饮料4*(2^i-1)
在用余下的人对2^i也即是这一轮每个人重复的个数,即可得到结果。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44#include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { long long m; cin >> m; int cnt = 0; long long num = 0; int i = -1, ci = pow(2, i); while ((long long)4 * ((long long)(pow(2, i+1)-1)) < m) i++; //找是第几(i)次克隆 if (i >= 0) { m = m - (long long)(4)*(long long)(pow(2, i) - 1); //减去前i-1次所有的人 cnt = (m - 1) / pow(2, i); //第i次每个人重复有2^i,取整得人的标记 } else { cnt = m - 1; } switch (cnt) { case 0: { cout << "Alice" << endl; break; } case 1: { cout << "Bob" << endl; break; } case 2: { cout << "Cathy" << endl; break; } case 3: { cout << "Dave" << endl; break; } default: break; } return 0; }
2、N个球星,M个人评级,共a-z 26个级别,a最高,z最低,球星X比球星Y评级高,则认为球星X强于球星Y,,所有一个球星强于其他所哟球星,则认为其为球王。问谁能得到球王称号
例1:N=4,M=3,评价为acbd,bacd,bdca,输出为0;
例2:N=3,M=3,评价为abc,bca,cab,输出为-1.
分析:
这个题把所有的求和级别转成数字加起来直接比较能有70%,后来在牛客网上看到一个讨论觉得很有道理,不应该用总和来求,应该用字母的优先级来求即如下例子:
输入为N=2,M=3,评价为:aa,ba,bc,输出应该为1,因为这里是abb,aac,虽然总数一样,但是应该是1强于0的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46#include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { int N, M; cin >> N >> M; vector<string> vs; string s; getline(cin, s); for (int i = 0; i < M; i++) { string st; getline(cin, st); vs.push_back(st); st.clear(); } vector<string> vsT(N,string()); for (int i = 0; i < N; i++) { for (int j=0;j<M;j++) { vsT[i] += vs[j][i]; } } vector<string> svsT(vsT.begin(), vsT.end()); sort(vsT.begin(), vsT.end()); if (svsT[0] == svsT[1]) { cout << -1 << endl; } else { for (int i = 0; i < N; i++) { if (vsT[i] == svsT[0]) { cout << i << endl; } } } system("pause"); return 0; }
3、N个货物分别重W1,W2,...Wn,(100<=W<=300),一辆车可以运300的货,问需要多少辆车
分析:
这个题在笔试时用的是直接排序后贪心,只能50%,后来想借鉴0-1背包问题,使得每个箱子装的东西尽可能多,也就是贪心那个方式改了一下,但感觉这种方式对这个题应该跟贪心差不多,因为我们物品放得最多也就100,100,100三件,其他情况最多都是两件,用0-1背包问题来解其实跟贪心差不多,复杂度还高了,而就这个题是在想不出一个贪心解决不了的例子。不知道有没有更好的例子或者更好的算法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73//背包问题来解 #include <iostream> #include <vector> #include <string> #include <algorithm> using namespace std; int main() { string s; getline(cin, s); vector<int> vi; int i = 0; while (i < s.size() && s[i] != '') { string s1; while (i < s.size() && s[i] != ' ') { s1 += s[i]; i++; } i++; int k = atoi(s1.c_str()); vi.push_back(k); } int re = 0; sort(vi.begin(), vi.end()); for (int i = vi.size() - 1; i >= 0; i--) { if (vi[i] > 200) { re++; vi.erase(vi.begin() + i); } } int cnt = 0, num = 300; vector < int> maxvalue(101,0); vector<bool> vb(vi.size(),0); while (cnt<vi.size()) { cnt = 0; for (int i = vi.size()-1; i >=0; i--) { if (cnt < vi.size()) { if (vb[i] == 0) { if (maxvalue[100] < maxvalue[100 - vi[i] + 100] + vi[i]&& maxvalue[100 - vi[i] + 100] + vi[i]<=300) { vb[i] = 1; } for (int j=100; j >=vi[i]-100; j--) { if (maxvalue[j] < maxvalue[j - vi[i]+100] + vi[i]) { maxvalue[j] = maxvalue[j - vi[i]+100] + vi[i]; } } } } if (vb[i] == 1) cnt++; } if (maxvalue[100] > 0) re++; maxvalue.assign(101, 0); } cout << re << endl; system("pause"); return 0; }
4. 这个题跟算法岗有一个题一样,见网址https://blog.csdn.net/song2016/article/details/81188457
最后
以上就是坚定帅哥最近收集整理的关于18年拼多多学霸批基础平台笔试题的全部内容,更多相关18年拼多多学霸批基础平台笔试题内容请搜索靠谱客的其他文章。
发表评论 取消回复