Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
提醒一下后来人吧,除了数组大小、稳定排序等问题以外的问题代码如下,区别在于分治函数countInversion返回值的调用方法,理论上来讲应该是从左到右依序计算的,然而并不能通过,改写强制规定调用顺序之后AC,有点蛋疼。。。 #include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> using namespace std; char s[200][100],dna[100],sortedDna[100]; int inversion[200]; int dna_index[200]; int mergeSort(int l, int m, int r) { int index_first = l,index_second = m; int index = l; int count = 0; while(index_first < m || index_second < r) { if(index_first >= m){ sortedDna[index++] = dna[index_second++]; continue; } if(index_second >= r) { sortedDna[index++] = dna[index_first++]; continue; } if(dna[index_first] > dna[index_second]) { sortedDna[index++] = dna[index_second++]; count += m - index_first; } else { sortedDna[index++] = dna[index_first++]; } } for(int i = l;i < r;i ++) // Copy sorted array back dna[i] = sortedDna[i]; //printf("%s,%d %d %d,count:%d\n",dna,l,m,r,count); return count; } int countInversion(int l, int r) { if(l + 1 >= r) return 0; int m = (l + r) / 2; int l_value = countInversion(l, m), r_value = countInversion(m, r); return l_value + r_value + mergeSort(l, m, r); //AC //return countInversion(l, m) + countInversion(m, r) + mergeSort(l, m, r); //WA } void swap(int a,int b) { int t = inversion[a]; inversion[a] = inversion[b]; inversion[b] = t; t = dna_index[a]; dna_index[a] = dna_index[b]; dna_index[b] = t; } int divide(int l, int r) { int pivot_value = inversion[r - 1],pivot_index = dna_index[r - 1]; int sort_index = l - 1; for(int i = l;i < r - 1;i ++) { if(inversion[i] < pivot_value) swap(i, ++sort_index); else if(inversion[i] == pivot_value && dna_index[i] < pivot_index) swap(i, ++sort_index); } swap(++sort_index, r - 1); return sort_index; } void qsort(int l, int r) { if(l + 1 >= r) return; int q = divide(l, r); qsort(l, q); qsort(q + 1, r); return; } int main(int argc, const char * argv[]) { int n,m; scanf("%d %d", &m, &n); for(int i = 0;i < n;i ++) { scanf("%s",s[i]); memcpy(dna, s[i], sizeof(char) * 100); //inversion[i] = count_inver(s[i], m); inversion[i] = countInversion(0, m); dna_index[i] = i; } qsort(0, n); for(int i = 0;i < n;i ++) printf("%s\n",s[dna_index[i]]); return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator