UVa 11321

UVa 11321

題目

http://domen111.github.io/UVa-Easy-Viewer/?11321

給定一個長度為 $n$ 的序列以及一個正整數 $m$

根據以下的規則排序

  • 若 $p % m < q % m$
    $p$ 排在 $q$ 前面
  • 若 $p % m > q % m$
    $q$ 排在 $p$ 前面
  • 若 $p % m = q % m$
    • 若 $p, q$ 皆為偶數
      小的排前面
    • 若 $p, q$ 皆為奇數
      大的排前面
    • 否則
      奇數的排前面

想法

只需要根據題目的意思自訂 compare function 即可

Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//By Koios1143
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n, m, arr[10010];

bool cmp(int a, int b){
if(a%m != b%m) return a%m < b%m;
else{
if(a%2==0 && b%2==0) return a < b;
else if(abs(a%2)==1 && abs(b%2)==1) return a > b;
else return abs(a%2)==1;
}
}

int main(){
while(cin>>n>>m && (n!=0 && m!=0)){
for(int i=0 ; i<n ; i++){
cin>>arr[i];
}
sort(arr, arr+n ,cmp);
cout<<n<<" "<<m<<"\n";
for(int i=0 ; i<n ; i++){
cout<<arr[i]<<"\n";
}
}
cout<<"0 0\n";
return 0;
}

時間複雜度分析

每筆測資輸入時間複雜度為 $O(n)$

每筆測資排序時間複雜度為 $O(nlogn)$

每筆測資輸出時間複雜度為 $O(n)$

每筆測資總時間複雜度為 $O(n + nlogn)$