1、Alice、Bob、Cathy、Dave四个人排队喝可乐,喝完一个人变两个,接着继续到队尾排队,问第N个人喝可乐的人是谁
如:N=8: ABCDAABB,第八个人是B,
分析:
这个问题相当每次翻倍,要看第N个人喝饮料的是谁,就要知道这是第几(i)轮喝饮料,然后减去前几轮所有喝的饮料4*(2^i-1)
在用余下的人对2^i也即是这一轮每个人重复的个数,即可得到结果。
#include
#include
#include
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
#include
#include
#include
using namespace std;
int main()
{
int N, M;
cin >> N >> M;
vector 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 vsT(N,string());
for (int i = 0; i < N; i++)
{
for (int j=0;j 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
#include
#include
#include
using namespace std;
int main()
{
string s;
getline(cin, s);
vector vi;
int i = 0;
while (i < s.size() && s[i] != '\0')
{
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 vb(vi.size(),0);
while (cnt=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