HDU(1106):排序
阿新 • • 發佈:2018-12-20
題目:
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 75113 Accepted Submission(s): 23029
Problem Description
輸入一行數字,如果我們把這行數字中的‘5’都看成空格,那麼就得到一行用空格分割的若干非負整數(可能有些整數以‘0’開頭,這些頭部的‘0’應該被忽略掉,除非這個整數就是由若干個‘0’組成的,這時這個整數就是0)。 你的任務是:對這些分割得到的整數,依從小到大的順序排序輸出。
Input
輸入包含多組測試用例,每組輸入資料只有一行數字(數字之間沒有空格),這行數字的長度不大於1000。 輸入資料保證:分割得到的非負整數不會大於100000000;輸入資料不可能全由‘5’組成。
Output
對於每個測試用例,輸出分割得到的整數排序的結果,相鄰的兩個整數之間用一個空格分開,每組輸出佔一行。
Sample Input
0051231232050775
Sample Output
0 77 12312320
題解:
這個題的題意很好理解:輸入一數字字串,其中數字“5”作為“空格”分隔符,每一部分作為一個數,並進行排序。根據例題輸出中的資料就可以知道,若全是0構成的部分(000、0000等)都作為0處理,而“0775”則作為775處理。
1、字串轉換為整數型陣列;
2、存在連續是5的情況,則全部作為空格處理;
3、sort函式排序;
程式碼:
#include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; char x[1005]; int y[1000]; char t[1000]; int z=0; int f(int a){ int sum=1; if(a==0) return 1; else{ for(int i=1;i<=a;i++) sum*=10; } return sum; } int main() { while(~scanf("%s",x)){ int len=strlen(x); int sum=0; int a=0; for(int i=len-1;i>=0;i--){ if(x[i]!='5'){ sum+=(x[i]-'0')*f(a++); if(i==0) y[z++]=sum; } else{ if(i==len-1) continue; if(x[i]=='5'&&x[i+1]=='5') continue; else{ y[z++]=sum; sum=0; a=0; } } } sort(y,y+z); for(int i=0;i<z;i++){ printf("%d",y[i]); if(i!=z-1) printf(" "); else printf("\n"); } z=0; } return 0; }