题目描述
东东在一本古籍上看到有一种神奇数,如果能够将一个数的数字分成两组,其中一组数字的和等于另一组数字的和,我们就将这个数称为神奇数。例如242就是一个神奇数,我们能够将这个数的数字分成两组,分别是{2,2}以及{4},而且这两组数的和都是4.东东现在需要统计给定区间中有多少个神奇数,即给定区间[l, r],统计这个区间中有多少个神奇数,请你来帮助他。
输入描述:
输入包括一行,一行中两个整数l和r(1 ≤ l, r ≤ 10^9, 0 ≤ r - l ≤ 10^6),以空格分割
输出描述:
输出一个整数,即区间内的神奇数个数
示例1
输入
复制
1 50
输出
复制
4
#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
int l,r;
bool IsMagical(vector<int>& vec)
{
int len = vec.size();
int sum = accumulate(vec.begin(), vec.end(), 0);
if (sum & 1)
return false;
int mid = (sum>>1);
vector<int> dp(mid + 1, 0);
dp[0] = 1;
for (int i = 0; i < len; ++i)
{
for (int j = mid; j > 0; --j)
{
if (j >= vec[i])
dp[j] = max(dp[j], dp[j - vec[i]]);
}
}
if (dp[mid])
return true;
else
return false;
}
vector<int> GetSortNum(int i){
vector<int >Result;
int tmp = 0;
while(i){
tmp = i % 10;
i = i / 10;
Result.push_back(tmp);
}
sort(Result.begin(),Result.end());
return Result;
}
int main(){
cin >> l >> r;
int Result = 0;
//unordered_map<vector<int>,bool> HashMap;
map<vector<int>,bool> HashMap;
if(l > r || r <= 10){
printf("%d\n",Result);
return 0;
}
for(int i = l ;i <= r;i++){
vector<int> Vec = GetSortNum(i);
auto it = HashMap.find(Vec);
if(it == HashMap.end()){
bool flag = IsMagical(Vec);
HashMap[Vec] = flag;
if(flag){
Result ++;
}
}
else{
if(it->second){
Result++;
}
}
}
printf("%d\n",Result);
return 0;
}
标签:map,return,HashMap,int,vector,Result,key,dp,vec From: https://blog.51cto.com/u_13121994/5798282