这个题是下午老师出的比赛题,看了很久都不知道这个题到底是什么意思,晚上上网看了下,才知道是求每个字符串里的每一个字母后面有几个比它小的字母的总和,并对总和按照从小到大排列,题目数据量较小,直接循环就过
《*——*》
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include<stdio.h> #include<string.h> #include<stdlib.h> struct node { int x,y; }a[110]; int cmp(const void *a,const void *b) { struct node *c,*d; c=(struct node *)a; d=(struct node *)b; if(c->y!=d->y) return c->x-d->x; else return c->y-d->y; } int main() { int t,n,m; int i,j,k,num; char str[101][51]; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<m;i++) { scanf("%s",str[i]); num=0; for(j=0;j<n;j++) { for(k=j+1;k<n;k++) { if(str[i][j]>str[i][k]) num++; } } a[i].x=num; a[i].y=i; } qsort(a,m,sizeof(a[0]),cmp); for(i=0;i<m;i++) { printf("%s\n",str[a[i].y]); } } return 0; }