2016 网易校招内推C/C++第二场8.6

选择题20个,每个1.5,编程题3个,每个20,简答题1个10分。

2016 网易校招内推C/C++第二场8.62016 网易校招内推C/C++第二场8.62016 网易校招内推C/C++第二场8.6

解:

第二题,一开始喵了一眼,好开心,这不是水题么,第一反应想到的是递归,然后马上就写了,结果case10%,一脸蒙蔽,数据值很大,考虑边界条件也比较困难。

递归:

 #include "iostream"
#define MAX 100000
#define tag 1000000007 typedef long long LL; using namespace std; LL x;
int n = ; LL solve(LL x, int n)
{
if (n > MAX)
return -;
if (( * x + ) % tag == || (( * x + ) % tag == ))
return n;
else
{
solve( * x + , n + );
solve( * x + , n + );
}
return ;
} int main()
{ cin >> x;
cout << solve(x, ); }

结束后和学弟讨论了下,学弟教我可以反向打表,时间换空间,把符合条件的位置都算出来,然后检索输入的在不再里面。然后我试着写了下,用STL的map,映射i次数和位置num。QWQ又学到了一招。满满的套路。

反向打表,map映射:

 #include "iostream"
#include "map"
#define MAX 100000
#define tag 1000000007 typedef long long LL; using namespace std; LL x;
int n = ; map<int,int> a,b; //
void fun()
{
for (int i = ; i < MAX; i++)
{
for (int num = tag*i,j=; ;j++ )
{
a.insert(pair<int,int>(num,j*i- ));
if ((num - ) % == )
num = (num - ) / ;
else
break;
} for (int num = tag*i, j = ; ; j++)
{
b.insert(pair<int, int>(num, j*i));
if ((num - ) % == )
num = (num - ) / ;
else
break;
}
}
} int main()
{
cin >> x; fun(); map<int, int>::iterator iter;
iter=a.find(x);
if (iter != a.end())
cout << iter->second; iter = b.find(x);
if (iter != b.end())
cout << iter->second;
}

真是尴尬我还不会Map里面怎么find value的值,只能把key和value的位置换了下。

上一篇:DDCX2018届校招内推笔试——算法工程师


下一篇:阿里提前批校招内推offer经历