概述
1、Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁
如:N=8: ABCDAABB,第八个人是B,
分析:
这个问题相当每次翻倍,要看第N个人喝饮料的是谁,就要知道这是第几(i)轮喝饮料,然后减去前几轮所有喝的饮料4*(2^i-1)
在用余下的人对2^i也即是这一轮每个人重复的个数,即可得到结果。
#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的
#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背包问题来解其实跟贪心差不多,复杂度还高了,而就这个题是在想不出一个贪心解决不了的例子。不知道有没有更好的例子或者更好的算法
//背包问题来解
#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] != '