选择题20个,每个1.5,编程题3个,每个20,简答题1个10分。
解:
第二题,一开始喵了一眼,好开心,这不是水题么,第一反应想到的是递归,然后马上就写了,结果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的位置换了下。