| ||||||||||
| 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 | |||||||||
Re:为何我不能AC。。求助In Reply To:为何我不能AC。。求助 Posted by:hbhb41307 at 2014-01-19 20:10:05 there's a O(n*log(n)) divide-and-conquer method for counting the # of inversion(s) :
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_LEN 50
#define MAX_NUM_STR 100
struct dna {
size_t idx;
size_t num_inv;
char str[MAX_LEN + 1];
};
int comp(const void *p1, const void *p2) {
return ((*(struct dna **)p1) -> num_inv < (*(struct dna **)p2) -> num_inv || ((*(struct dna **)p1) -> num_inv == (*(struct dna **)p2) -> num_inv && (*(struct dna **)p1) -> idx < (*(struct dna **)p2) -> idx)) ? -1 : 1;
}
size_t count_num_inv(const size_t start, const size_t end, char str[], char tmp[]) {
if (start == end) {
return 0;
}
size_t idx, l_idx, r_idx, num_inv;
size_t mid = (start + end) >> 1;
num_inv = count_num_inv(start, mid, str, tmp) + count_num_inv(mid + 1, end, str, tmp);
for (idx = start; idx <= end; ++idx) {
tmp[idx] = str[idx];
}
idx = start;
l_idx = start;
r_idx = mid + 1;
while (l_idx <= mid && r_idx <= end) {
if (tmp[r_idx] < tmp[l_idx]) {
str[idx++] = tmp[r_idx++];
num_inv += mid + 1 - l_idx;
}else {
str[idx++] = tmp[l_idx++];
}
}
while (l_idx <= mid) {
str[idx++] = tmp[l_idx++];
}
while (r_idx <= end) {
str[idx++] = tmp[r_idx++];
}
return num_inv;
}
int main(int argc, char *argv[]) {
unsigned int n, N;
size_t length;
char str[MAX_LEN + 1], tmp[MAX_LEN + 1];
struct dna dna_ent[MAX_NUM_STR], *dna_ptr[MAX_NUM_STR];
/*
some test data for counting # of inversion(s)
strcpy(str, "ZWQM");
printf("%lu\n", count_num_inv(0, 3, str, tmp));
printf("%s\n", str);
strcpy(str, "AACEDGG");
printf("%lu\n", count_num_inv(0, 6, str, tmp));
printf("%s\n", str);
strcpy(str, "DAABEC");
printf("%lu\n", count_num_inv(0, 5, str, tmp));
printf("%s\n", str);
*/
scanf("%lu", &length);
scanf("%u", &N);
for (n = 0; n < N; ++n) {
dna_ent[n].idx = n;
scanf("%s", str);
strcpy(dna_ent[n].str, str);
dna_ent[n].num_inv = count_num_inv(0, length - 1, str, tmp);
dna_ptr[n] = &(dna_ent[n]);
}
qsort(dna_ptr, N, sizeof(struct dna *), comp);
for (n = 0; n < N; ++n) {
printf("%s\n", dna_ptr[n] -> str);
}
return 0;
}
> #include<stdio.h>
> #include<stdlib.h>
> int main()
> {
> char a[101][51];
> int i,j,n,m,k,max=0,x;
> scanf("%d%d",&i,&j);
> int b[j];
> fflush(stdin);
> for(m=0;m<j;m++)
> {
> fflush(stdin);
> for(n=0;n<i;n++)
> {
> scanf("%c",&a[m][n]);
> }
> b[m]=0;
> }
>
> for(m=0;m<j;m++)
> {
> x=0;
> for(n=0;n<i-1;n++)
> {
> for(k=n+1;k<i;k++)
> {
>
> if(a[m][n]>a[m][k])
> {
> x++;
> }
> if(max<x)
> {
> max=x;
> }
> }
> }
> b[m]=x;
> }
> for(k=0;k<=max;k++)
> {
> for(m=0;m<j;m++)
> {
> if(b[m]==k)
> {
> for(n=0;n<i;n++)
> {
> printf("%c",a[m][n]);
> }
> printf("\n");
> }
> }
> }
> return 0;
> }
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator