JD2018校招神奇数,疯狂队列

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


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人梦想家

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值