题目链接:http://codeforces.com/problemset/problem/384/B
题目意思:给出n个数组,每个数组包括m个数字,当k = 0 时,需要把n个数组都按照从小到大的顺序排列,k = 1则把n个数组里面的数字按照从大到小的顺序排列。
直接模拟即可,不过有个地方注意下是可以减少工作量的,当处理第 i 行的时候,不再需要移动前 i - 1 行的数组下标。因为前 i - 1行的数组都排好序了。
1 #include <iostream> 2 #include <cstdio> 3 #include <cstdlib> 4 #include <algorithm> 5 using namespace std; 6 7 const int maxn = 1000 + 10; 8 const int maxm = 100 + 5; 9 10 int a[maxn][maxm]; 11 int ans[5000][2]; 12 13 int main() 14 { 15 int i, j, l, n, m, k, tj, cnt; 16 while (scanf("%d%d%d", &n, &m, &k) != EOF) 17 { 18 for (i = 1; i <= n; i++) 19 { 20 for (j = 1; j <= m; j++) 21 scanf("%d", &a[i][j]); 22 } 23 cnt = 0; 24 for (i = 1; i <= n; i++) // n 行 25 { 26 for (j = 1; j < m; j++) // m 列 27 { 28 tj = j; 29 int tmp = a[i][j]; 30 for (l = j+1; l <= m; l++) 31 { 32 if (tmp > a[i][l] && k == 0 || tmp < a[i][l] && k == 1) 33 { 34 tmp = a[i][l]; // 找出第 i 行中第 j 个最少的数 35 tj = l; 36 } 37 } 38 if (j != tj) 39 { 40 swap(a[i][tj], a[i][j]); // 找完之后要交换 41 if (k == 0) 42 { 43 ans[cnt][0] = j; 44 ans[cnt][1] = tj; 45 } 46 else 47 { 48 ans[cnt][0] = tj; 49 ans[cnt][1] = j; 50 } 51 cnt++; 52 for (l = i+1; l <= n; l++) // 处理第i+1 ~ n 行的数组 53 { 54 if (a[l][j] > a[l][tj] && k == 0 || a[l][j] < a[l][tj] && k == 1) 55 swap(a[l][j], a[l][tj]); 56 } 57 } 58 } 59 } 60 printf("%d\n", cnt); 61 for (i = 0; i < cnt; i++) 62 printf("%d %d\n", ans[i][0], ans[i][1]); 63 } 64 return 0; 65 }
codeforces B. Multitasking 解题报告
原文:http://www.cnblogs.com/windysai/p/3543197.html