算阶,jdk和idea的安装
用unordered_map存入,减少时间复杂度,然后通过题目比对求答案
#include <iostream>
#include <unordered_map>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n;
unordered_map<int, int> nums;
for (int i = 0; i < n; i++) {
int num;
cin >> num;
nums[num]++;
}
cin >> m;
vector<int> dy1(m + 1);
vector<int> dy2(m + 1);
for (int i = 1; i <= m; i++) {
cin >> dy1[i];
}
for (int i = 1; i <= m; i++) {
cin >> dy2[i];
}
int dynum = 1;
int maxHappy = 0;
int tt = 0;
for (int i = 1; i <= m; i++) {
int happy = nums[dy1[i]];
int _tt = nums[dy2[i]];
if (happy > maxHappy || (happy == maxHappy && _tt > tt)) {
dynum = i;
maxHappy = happy;
tt = _tt;
}
}
cout << dynum << endl;
return 0;
}
排序加中位数为∣x−a∣+∣x−b∣+∣x−c∣+⋯+∣x−n∣∣x−a∣+∣x−b∣+∣x−c∣+⋯+∣x−n∣ 的最小值
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n;
cin >> n;
vector<int> stores(n);
for (int i = 0; i < n; i++) {
cin >> stores[i];
}
sort(stores.begin(), stores.end());
int mid = stores[n / 2];
int sum = 0;
for (auto& store : stores) {
sum += abs(mid - store);
}
cout << sum << endl;
return 0;
}
直接使用归并排序
#include <iostream>
#include <vector>
using namespace std;
long long mergesort(vector<int>& nums, int left, int right) {
if (left >= right) return 0;
int mid = left + (right - left) / 2;
long long cnt = 0;
cnt += mergesort(nums, left, mid);
cnt += mergesort(nums, mid + 1, right);
vector<int> temp(right - left + 1);
int i = left, j = mid + 1, k = 0;
while (i <= mid && j <= right) {
if (nums[i] <= nums[j]) {
temp[k++] = nums[i++];
}
else {
temp[k++] = nums[j++];
cnt += mid - i + 1;
}
}
while (i <= mid) temp[k++] = nums[i++];
while (j <= right) temp[k++] = nums[j++];
for (int p = 0; p < k; p++) {
nums[left + p] = temp[p];
}
return cnt;
}
int main() {
int n;
while (cin >> n && n != 0) {
vector<int> nums(n);
for (int i = 0; i < n; i++) {
cin >> nums[i];
}
long long cnt = mergesort(nums, 0, n - 1);
cout << cnt << endl;
}
return 0;
}