iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 1
0
自我挑戰組

CPE 一星精選全攻略系列 第 1

Day1 #UVa 11321 & UVa 10041

  • 分享至 

  • xImage
  •  

UVa 11321 - Sort! Sort!! and Sort!!!

題目連結

題目說明

先給你兩個數 N、M,然後給 N 個數,要你照某些規則排序。利用每個數字除以 M 的餘數由小到大排,若排序中相鄰的兩數為一奇一偶且兩數除以 M 的餘數相等,則奇數要在偶數前面。若兩奇數除以 M 餘數大小相等,則原本數值較大的奇數排在前面。同樣的,若兩偶數除以 M 餘數大小相等,則較小的偶數排在前面。

做法

水題,照著規則排序就好了,這裡我直接寫 sort() 函數的第三參數去判斷,簡單輕鬆的一道題。

#include "bits/stdc++.h"

using namespace std;

int n, m;
bool cmp(int i, int j) {
    if (i % m != j % m) {
        return i % m < j % m;
    }
    if ((i & 1) && (j & 1))
        return i > j;
    else if (!(i & 1) && !(j & 1))
        return i < j;
    else
        return i & 1;
}

int main() {
    while (cin >> n >> m, n) {
        cout << n << " " << m << endl;
        vector<int> nums(n);
        for (auto& i : nums) {
            cin >> i;
        }
        sort(nums.begin(), nums.end(), cmp);
        for (auto& i : nums)
            cout << i << endl;
    }
    cout << 0 << " " << 0 << endl;
}

UVa 10041 - Vito's Family

題目連結

題目說明

簡單來說就是你要從所有點中找出一個點到所有點的距離和為最小值。

做法

直接排序取中位數,然後中位數減其餘的數加總就是答案了。

#include <bits/stdc++.h>

using namespace std;

int main() {
    int kase;
    cin >> kase;
    while (kase--) {
        int n,mid;
        int ans=0;
        cin >> n;
        vector<int> nums(n);
        for (auto& i : nums) cin >> i;
        sort(nums.begin(), nums.end());
        mid = nums[n/2];
        for(auto& i :nums) 
            ans+=abs(i-mid);
        cout<<ans<<endl;
    }
    return 0;
}

下一篇
Day2 #UVa 10055 & UVa 10035
系列文
CPE 一星精選全攻略9
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言