Как преобразовать функцию сортировки C ++ в Swift? - PullRequest
0 голосов
/ 12 июня 2018

Я преобразовал кодировку 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
})

Почему эти программы дают разные значения?Как я могу решить это?

Обновление:

Входы:

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

1 Ответ

0 голосов
/ 12 июня 2018

Эта статья объясняет, как реализация по умолчанию sort работает для вектора пар в C ++, она просто сортирует вектор в порядке возрастания на основе первого элемента.

Ваш код Swift делает обратное, сортировка в порядке убывания.Просто измените return element1.first > element2.first на return element1.first < element2.first, и все будет хорошо.

Между прочим, вы не должны просто конвертировать код за словом между языками.Преобразуйте алгоритм , а не код C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...