京东今年的校招题是说输入两个数 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输出即为解。