384b

来源:互联网 发布:ubuntu jira部署 编辑:程序博客网 时间:2024/06/10 01:03
/*题目意思:给出n个数组,每个数组包括m个数字,当k = 0 时,需要把n个数组都按照从小到大的顺序排列,k = 1则把n个数组里面的数字按照从大到小的顺序排列。直接模拟即可,不过有个地方注意下是可以减少工作量的,当处理第 i 行的时候,不再需要移动前 i - 1 行的数组下标。因为前 i - 1行的数组都排好序了*/#include<stdio.h>#include<algorithm>#define N 1005using namespace std;int a[N][N],b[N][3];int main(){    int i,j,k,ma,cnt,u,p,n,m,l;    while(scanf("%d%d%d",&n,&m,&p)!=EOF)    {        cnt=0;        for(i=1;i<=n;i++)         for(j=1;j<=m;j++)            scanf("%d",&a[i][j]);        for(i=1;i<=n;i++)        {            for(j=1;j<m;j++)            {                ma=a[i][j]; u=j;                for(k=j+1;k<=m;k++)                {                    if((ma>a[i][k]&&p==0)||(ma<a[i][k]&&p==1))                    {                        ma=a[i][k];                        u=k;                    }                }                if(u!=j)                {                    swap(a[i][j],a[i][u]);                    if(p==0)                    {                       b[cnt][0]=j;                       b[cnt][1]=u;                    }                    else                    {                        b[cnt][0]=u;                        b[cnt][1]=j;                    }                    cnt++;                for(l=i+1;l<=n;l++)                {                    if((a[l][j]>a[l][u]&&p==0)||(a[l][j]<a[l][u]&&p==1))                    {                        swap(a[l][j],a[l][u]);                    }                }                }            }        }        printf("%d\n",cnt);        for(i=0;i<cnt;i++)         printf("%d %d\n",b[i][0],b[i][1]);    }    return 0;}/*  k = 0:从小到大排列。意味着所有数组中的第一个数是最小的!这个最小的数如何找?无非就在该行中的某一个数里面。由于不确定在哪里,但用两重循环势必能找出,于是就有了以下简单的方法:对于i = 1,a[i] 可能不是最小的数,于是不断地跟a[i+1], a[i+2], ..., a[m] 比较,即找出排在第一个的数输出 1, 2;  1, 3;  ...; 1, m 即可,这样能能保证每个数组都能找出最小的数。第二个最小的数就是2, 3;  2,  4; ...;  2, m了,后面的依次类推。但主要题目中说的,当第 i  个位置的 value  > 第 j 个位置的 value 才能交换这个条件。k = 1 则是2, 1; 3, 1; ...; m 1 输出 。*/#include<stdio.h>int main(){    int n,m,k,i,j,a;    while(scanf("%d%d%d",&n,&m,&k)!=EOF)    {        for(i=1;i<=n;i++)         for(j=1;j<=m;j++)          scanf("%d",&a);        printf("%d\n",m*(m-1)/2);        for(i=1;i<=m;i++)        {            for(j=i+1;j<=m;j++)            if(k==0)              printf("%d %d\n",i,j);            else             printf("%d %d\n",j,i);        }    }    return 0;}

0 0
原创粉丝点击