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