我将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/

10-11 23:18
查看更多