project euler 62:cubic permutations-爱代码爱编程
思路:
枚举: 枚举立方根, 同时记录这个立方数及排序后的立方数的出现次数, 若已经出现5次则返回其中最小的立方数. (注: 这样做法的正确性需要满足一个符合直觉的前提条件:当x>5时, 重排中恰好有x个立方数的最小立方数>重排中恰好有5个立方数的最小立方数,若不满足答案返回的立方数重排中有>5个立方数. 经结果验证这个条件满足…)
typedef long long ll;
ll solution() {
int tar = 5;
unordered_map<string, vector<ll>> cnt; // 排序后的立方数 -> { 立方数 }
for (ll i = 1;; i++) {
ll t = i * i * i;
string s = to_string(t);
sort(s.begin(), s.end());
cnt[s].push_back(t);
if (cnt[s].size() == tar)
return cnt[s].front();
}
}