我将C++编码转换为Swift Coding。但是,我无法完全理解此函数sort(v.begin(), v.end());
。但是,我已经写了我从中了解的内容。
问题是快速代码给出的输出与关于C++代码的输出不同。##标题##
C++
#include <vector>
#include <iostream>
#include <fstream>
#include <algorithm>
#include <array>
using namespace std;
typedef long long ll;
ll solve(ll N,ll K,vector<ll > &token){
ll ans=0;
vector< pair<ll, int> > v;
for(int i = 0; i < N; i++)
v.push_back( make_pair(token[i], N - i));
sort(v.begin(), v.end());
for(int i = 0; i < N; i++){
if( K >= v[i].second * v[i].first){
K -= v[i].second * v[i].first;
ans += v[i].second;
}
else{
ans += K / v[i].first;
K = 0;
}
}
return ans;
}
int main(){
ll N = 57;
ll K = 877914575;
static const int arr[] = {436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965};
vector<ll> token (arr, arr + sizeof(arr) / sizeof(arr[0]) );
cout<<solve(N,K,token);
}
Swift代码(我尝试转换):
import Foundation
typealias ll = Int64
func solve(_ N:ll, K:ll, token:inout [ll])->ll{
var ans:ll = 0
var K = K
var v = [(first:ll,second:ll)]()
for i in 0..<N{
v.append((token[Int(i)],N-i))
}
v = v.sorted(by: { (element1, element2) -> Bool in
return element1.first > element2.first
})
for i in 0..<N{
if(K >= ll(v[Int(i)].second) * v[Int(i)].first){
K -= ll(v[Int(i)].second) * v[Int(i)].first
ans += ll(v[Int(i)].second)
}else{
ans += K/v[Int(i)].first
K = 0
}
}
return ans
}
func main(){
let N:ll = 57;
let K:ll = 877914575;
var token:[ll] = [436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965]
print(solve(N, K: K, token: &token))
}
main()
对于上述代码,C++将输出提供给
1637
,而Swift将输出提供给1438
。但是没有Sorting
的话,它们的编号就等于1612
我以为我在对
v
的值进行排序时做错了。但是,我不确定下面的Swift代码是否等效于C++排序。在上面的代码中排序:
C++:
sort(v.begin(), v.end());
swift
v = v.sorted(by: { (element1, element2) -> Bool in
return element1.first > element2.first
})
为什么这些程序具有不同的值(value)?我该如何解决?
更新:
输入:
let N:ll = 57;
let K:ll = 877914575;
var token:[ll] = [436426,979445,648772,690081,933447,190629,703497,47202,407775,894325,963982,804784,968417,302156,631932,735902,895728,78537,723857,330739,286918,329211,539679,238506,63340,686568,361868,660016,287940,296263,224593,601449,836991,890310,823355,177068,11431,8580,291757,449218,374934,594328,163676,829355,996221,899080,195922,531545,748511,34067,575467,338674,284691,206504,999835,262034,344965]
预期结果:
1637
最佳答案
This文章解释了sort
的默认实现对于C++中的 vector 对如何工作,它只是基于第一个元素以升序对 vector 进行排序。
您的Swift代码执行相反的操作,以降序排列。只需将return element1.first > element2.first
更改为return element1.first < element2.first
,就可以了。
顺便说一句,您不应该只是在语言之间逐字转换代码。转换算法而不是C++代码。
关于c++ - 如何将C++排序函数转换为Swift?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50816257/