# 題目 * 給你兩個整數 N (0<N<=10000), M (0<M<=10000),你要依照某些規則排序N個整數。先利用每個數字除以M的餘數由小到大排,若排序中比較的兩數為一奇一偶且兩數除以M 的餘數相等,則奇數要排在偶數前面。若兩奇數除以M餘數大小相等,則原本數值較大的奇數排在前面。同樣的,若兩偶數除以M餘數大小相等,則較小的偶數排在前面。至於負數的餘數計算和 C 語言裡的定義相同,即負數的餘數絕對不會大於零。例如 -100 MOD 3 = -1, -100 MOD 4 = 0 依此類推。 > [題目連結請點此](https://onlinejudge.org/external/113/11321.pdf) # 思路 把資料都封裝到容器vector中,因為vector排序相對容易實現且穩定,排序的順序是 `依照餘數建立區塊(升冪)` -> `專注到區塊中實現區塊內排序(奇數在偶數前)` -> `奇數以降冪排序` -> `偶數以升冪排序` -> `結束排序`,直接輸出排序好的vector即可完成題目。 # CODE ```C++=1 #include <iostream> #include <vector> #include <algorithm> using sv=std::vector<int>; class Solution { int N, M; sv ans; private: // 依據排序的規則排序,(餘數升冪、(奇數降冪、偶數升冪))。 void vec_sort(sv& v) { std::sort(v.begin(),v.end(),[this](const int& a, const int& b){ int AM=a%M, BM=b%M; if(AM==BM) { if(a%2==0&&b%2==0) return b>a; if(a%2!=0&&b%2!=0) return a>b; return a%2!=0; } return BM>AM; } ); } // 讀取測資到容器vector sv vec_input() { sv tem(N); for(int i=0;i<N;++i) std::cin>>tem[i]; return tem; } public: // 運用構造函式將N,M的數值轉移到class中 Solution(int n, int m):N(n), M(m) { printf("%d %d\n",N,M); } // 印出輸出答案 void showanswer() { ans=vec_input(); vec_sort(ans); for(int i:ans) printf("%d\n",i); } }; int main() { int N, M; //運用while使程式可以處理多case while(std::cin>>N>>M,N) { Solution solution(N,M); solution.showanswer(); } printf("0 0\n"); } ``` # 參考網站 1. [高中生程式解題系統](https://zerojudge.tw/ShowProblem?problemid=d750) 2. [瘋狂程設](http://coding-frenzy.arping.me/)