The following program is my ACcepted code for UVA-11321.
It's a for everybody to learn and discuss.
If there is any mistake or comment, please let me know. :D
此乃UVA 11321 的AC code!
點這裡看題目 Click here to see this Problem!
這題跟我之前所解的 UVA 612 DNA Sorting 寫法蠻相似的
請參考這理的解說:
This problem is similar with one of my solved problem: UVA 612 DNA Sorting
Please see this for reference.
//This program is for UVA 11321 Sort! Sort!! and Sort!!!
//題目來源 Problem link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2296
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct
{
int num;
int reminder;
}strSet;
/*
注意: 當你在判斷奇數或偶數時,不要使用 (a.num % 2)==1 來判斷奇數
因為當數字為負數時, (a.num % 2)是 -1
我使用 (a.num % 2)==1 拿了很多次 runtime error (RE)
所以我推薦直接使用 (a.num % 2) 來代表為奇數 (代表1 or -1)
(因為在C++判斷式中,非零就是代表 true!)
Note: when you judge the odd or even, don't use (a.num % 2)==1 to mean the odd!!!
Because when the number could be negative, (a.num % 2) would be -1 !
I used (a.num % 2)==1 to get runtime error (RE) several times.
So I recommend only use (a.num % 2) to mean the odd. (That means 1 or -1)
(In the condition, non-zero represent true!)
*/
bool cmp(strSet a, strSet b)
{
if(a.reminder != b.reminder)
return a.reminder < b.reminder;
if( (a.num % 2) && (b.num % 2) )//both of them are odd
return a.num > b.num;//larger precede the smaller one
else if( (a.num % 2 == 0) && (b.num % 2 == 0) )//both of them are even
return a.num < b.num;//smaller precede the larger one
else if( (a.num % 2) && (b.num % 2 == 0) )//a is odd, b is even
return true;//odd number precede the even
else if( (a.num % 2 == 0) && (b.num % 2) )//b is odd, a is even
return false;//odd number precede the even
return true;
}
int main()
{
int n, m;
vector<strSet> set;
while(scanf("%d %d", &n, &m) != EOF)
{
printf("%d %d\n", n, m);
if(n == 0 && m == 0)
break;
set.clear();
for(int i = 0; i < n; i++)
{
strSet tmp;
scanf("%d", &tmp.num);
tmp.reminder = tmp.num % m;
set.push_back(tmp);
}
//sort set[0] to set[n-1]
sort(set.begin(), set.end(), cmp);
for(int i = 0; i < n; i++)
printf("%d\n", set[i].num);
}
return 0;
}
Please feel free to use it after adding this blog as an reference. (http://autekroy.blogspot.tw) If there is any mistake or comment, please let me know. :D
歡迎使用與分享任何內容,但請記得標示此部落格為出處。(http://autekroy.blogspot.tw/) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )
It's a for everybody to learn and discuss.
If there is any mistake or comment, please let me know. :D
此乃UVA 11321 的AC code!
歡迎一同討論學習,如有錯誤與任何建議請留言 : )
點這裡看題目 Click here to see this Problem!
這題跟我之前所解的 UVA 612 DNA Sorting 寫法蠻相似的
請參考這理的解說:
This problem is similar with one of my solved problem: UVA 612 DNA Sorting
Please see this for reference.
//This program is for UVA 11321 Sort! Sort!! and Sort!!!
//題目來源 Problem link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=25&page=show_problem&problem=2296
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<vector>
using namespace std;
typedef struct
{
int num;
int reminder;
}strSet;
/*
注意: 當你在判斷奇數或偶數時,不要使用 (a.num % 2)==1 來判斷奇數
因為當數字為負數時, (a.num % 2)是 -1
我使用 (a.num % 2)==1 拿了很多次 runtime error (RE)
所以我推薦直接使用 (a.num % 2) 來代表為奇數 (代表1 or -1)
(因為在C++判斷式中,非零就是代表 true!)
Note: when you judge the odd or even, don't use (a.num % 2)==1 to mean the odd!!!
Because when the number could be negative, (a.num % 2) would be -1 !
I used (a.num % 2)==1 to get runtime error (RE) several times.
So I recommend only use (a.num % 2) to mean the odd. (That means 1 or -1)
(In the condition, non-zero represent true!)
*/
bool cmp(strSet a, strSet b)
{
if(a.reminder != b.reminder)
return a.reminder < b.reminder;
if( (a.num % 2) && (b.num % 2) )//both of them are odd
return a.num > b.num;//larger precede the smaller one
else if( (a.num % 2 == 0) && (b.num % 2 == 0) )//both of them are even
return a.num < b.num;//smaller precede the larger one
else if( (a.num % 2) && (b.num % 2 == 0) )//a is odd, b is even
return true;//odd number precede the even
else if( (a.num % 2 == 0) && (b.num % 2) )//b is odd, a is even
return false;//odd number precede the even
return true;
}
int main()
{
int n, m;
vector<strSet> set;
while(scanf("%d %d", &n, &m) != EOF)
{
printf("%d %d\n", n, m);
if(n == 0 && m == 0)
break;
set.clear();
for(int i = 0; i < n; i++)
{
strSet tmp;
scanf("%d", &tmp.num);
tmp.reminder = tmp.num % m;
set.push_back(tmp);
}
//sort set[0] to set[n-1]
sort(set.begin(), set.end(), cmp);
for(int i = 0; i < n; i++)
printf("%d\n", set[i].num);
}
return 0;
}
Please feel free to use it after adding this blog as an reference. (http://autekroy.blogspot.tw) If there is any mistake or comment, please let me know. :D
歡迎使用與分享任何內容,但請記得標示此部落格為出處。(http://autekroy.blogspot.tw/) 如果有發現任何的錯誤與建議請留言或跟我連絡。 : )
沒有留言:
張貼留言
請留下您的任何想法或建議!
Please leave any thought or comment!