Đăng nhập để hỏi chi tiết


C++ hay python đều đc
Hãy luôn nhớ cảm ơn và vote 5*
nếu câu trả lời hữu ích nhé!
#include <bits/stdc++.h>
using namespace std;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n; long long k;
if(!(cin>>n>>k)) return 0;
vector<long long> a(n), b(n);
for(int i=0;i<n;i++) cin>>a[i];
for(int i=0;i<n;i++) cin>>b[i];
long long base = 0;
vector<int> ra, rb;
ra.reserve(n); rb.reserve(n);
for(int i=0;i<n;i++){
base += a[i] / k;
ra.push_back(int(a[i] % k));
}
for(int i=0;i<n;i++){
base += b[i] / k;
rb.push_back(int(b[i] % k));
}
sort(ra.begin(), ra.end(), greater<int>());
multiset<int> ms;
for(int x: rb) ms.insert(x);
long long extra = 0;
for(int r : ra){
if(ms.empty()) {
if(r==0) extra += 0; else extra += 1;
continue;
}
int need = int(k - r);
auto it = ms.upper_bound(need);
if(it==ms.begin()){
auto it2 = ms.begin();
int val = *it2;
ms.erase(it2);
if(r + val == 0) extra += 0;
else if(r + val <= (int)k) extra += 1;
else extra += 2; // r+val > k
} else {
--it;
int val = *it;
ms.erase(it);
if(r + val == 0) extra += 0;
else extra += 1;
}
}
cout << (base + extra) << '\n';
return 0;
}Hãy giúp mọi người biết câu trả lời này thế nào?
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main() {
ll n,k;
cin>>n>>k;
vector<ll> a(n),b(n);
for (ll &x:a) cin>>x;
for (ll &x:b) cin>>x;
vector<ll> tam(n);
iota(tam.begin(),tam.end(),0);
ll res=LLONG_MAX;
do {
ll tong=0;
for (ll i=0;i<n;i++) {
ll s=a[i]+b[tam[i]];
tong+=(s+k-1)/k;
}
res=min(res,tong);
} while (next_permutation(tam.begin(),tam.end()));
cout<<res;
return 0;
}
Ta có:
`@` Hàm next_permutation() dùng để hoán vị tiếp theo
`@` Hàm iota() là một hàm thư viện được sử dụng để điền vào một phạm vi các phần tử với các giá trị tăng dần bắt đầu từ giá trị ban đầu đã cho
Hãy giúp mọi người biết câu trả lời này thế nào?
Bảng tin