熱門文章

2025年3月16日 星期日

ZeroJudge 解題筆記:f707. 幸運 7 (Lucky Seven)

作者:王一哲
日期:2025年3月17日



ZeroJudge 題目連結:f707. 幸運 7 (Lucky Seven)

解題想法


這題考排序,需要自訂排序的比較式。

Python 程式碼


使用時間約為 45 ms,記憶體約為 3.9 MB,通過測試。
import sys
from functools import cmp_to_key

def mycmp(a, b):
    if a%7 == 0 and b%7 != 0: return -1  # a 可以被 7 整除但 b 不行,a 往前放
    elif a%7 != 0 and b%7 == 0: return 1  # a 不行被 7 整除但 b 可以,a 往後放
    elif a%7 == 0 and b%7 == 0:  # a、b 都可以被 7 整除
        if a%70 > b%70: return -1  # a 除以 70 的餘數比較大,a 往前放
        elif a%70 < b%70: return 1  # a 除以 70 的餘數比較小,a 往後放
        else: return 0
    else:  # a、b 都不行被 7 整除
        if a%77 < b%77: return -1  # a 除以 77 的餘數比較小,a 往前放
        elif a%77 > b%77: return 1  # a 除以 77 的餘數比較大,a 往後放
        else: return 0

for line in sys.stdin:
    arr = list(map(int, line.split()))[:-1]  # 轉成整數串列並去掉最後一項
    arr.sort(key = cmp_to_key(mycmp))  # 排序
    print(arr[0])  # 最大值在首項


C++ 程式碼


使用時間約為 2 ms,記憶體約為 348 kB,通過測試。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int a;  // 儲存資料用的變數
    while(cin >> a) {
        vector<int> arr = {a};  // 儲存資料用的陣列
        while(true) {  // 無窮迴圈
            cin >> a;  // 讀取 a
            if (a == 0) break;  // 如果 a 等於 0 中止迴圈
            arr.push_back(a);  // 將 a 加入 arr
        }
        sort(arr.begin(), arr.end(), [] (int x, int y) {
            if (x%7 == 0 && y%7 != 0) return true;  // x 可以被 7 整除但 y 不行回傳 true
            else if (x%7 != 0 && y%7 == 0) return false;  // x 不行被 7 整除但 y 可以回傳 false
            else if (x%7 == 0 && y%7 == 0) return x%70 > y%70;  // x、y 都可以被 7 整除,回傳 x%70 > y%70
            else return x%77 < y%77;  // 最後一種狀況,回傳 x%77 < y%77
            } );  // 排序
        cout << arr[0] << "\n";  // 最大值在首項
    }
    return 0;
}


沒有留言:

張貼留言