UVa 11321 : Sort! Sort!! And Sort!!!
問題概要:
n個の要素 a[i]( 0 <= i < n )とMが与えられる
a[i]を以下の条件に従ってソートする
・a[i] % M の値が小さい順にソートする
・a[i] % M の値が同じ場合
・a[i]とa[j]の片方が偶数で片方が奇数ならば奇数を先にする
・a[i]とa[j]の両方が偶数なら小さい順にする
・a[i]とa[j]の両方が奇数なら大きい順にする
解法:
その通りに実装する
偶数か奇数か判定する際に、
%を使う場合は絶対値をとったほうが良い、、(-1対策)
それか&1をとると良い
コード:
#define REP(i,s,n) for(int i=s;i<n;i++) #define rep(i,n) REP(i,0,n) using namespace std; int N,M; struct P { int value; P(int value=INT_MAX):value(value){} bool operator < (const P& a)const { if(value%M != a.value%M) { return value%M < a.value%M; } if((value&1) != (a.value&1)) { return (value&1) > (a.value&1); } if(value&1) { return value > a.value; } return value < a.value; } }; int main() { while(1) { cin >> N >> M; cout << N << " " << M << endl; if(!(N|M))break; vector<P> vec(N); rep(i,N)cin >> vec[i].value; sort(vec.begin(),vec.end()); rep(i,N)cout << vec[i].value << endl; } return 0; }