JD2018校招神奇数,疯狂队列

来源:互联网 发布:小蜜蜂软件 编辑:程序博客网 时间:2024/05/17 13:41

京东今年的校招题是说输入两个数 l , r; 在这个范围内的神奇数有多少个。

神奇数是什么? 121  134 45999这样的数叫神奇数,可以将组成一个数的所有一位数字分为两组,两组数的和相等

如: {1,1} {2} ;  {1,3} {4};{4,5,9} {9,9};

现场ac10%,思路一直不对 

事实上正确的思路应该是先将数打散分到数组里,之后计算后续步骤

AC代码如下



#include "stdafx.h"#include <iostream>#include <vector>#include <algorithm>using namespace std; bool IsNum(int &in){       vector<int> arry;       int num=in;       int half=0;       while(num){//将数字打散存入arry数组              arry.push_back(num%10);              half+=num%10;              num/=10;       }       if (half%2!=0) return false;       half/=2;       vector<int> dp(half+1); //之后这一小段用的是01背包,判断能装下最大的数和一半是否相等。       for (int i=0;i<arry.size();i++){              for(int j=half;j>=arry[i];j--){                     dp[j]=max(dp[j],dp[j-arry[i]]+arry[i]);              }       }       return dp[half]==half;} int _tmain(int argc, _TCHAR* argv[]){       int l,r;       cin>>l>>r;       int count=0;       for(int i=l;i<=r;i++){              if(IsNum(i))                     count++;//如果是神奇数,计数+1       }       cout<<count<<endl;       system("pause");       return 0;}


疯狂队列这道题很简单

122333444455555666666777777788...

k个数字每个数字有k个

求第k个数字是什么

事实上这就是一个等差数列sum = 1+2+3+4+5+6...一直加到n  总共有  sum=n(1+n)/2

这是我们小学就学过的数学。

将输入的k带入公式,令sum=k;求解n    n=(-b± sqrt(b^2-4*a*c))/ 2*a   只取正号

n%1输出即为解。


原创粉丝点击