题意:题目真难懂 自行理解。。。
解题思路:其实只要考虑两列就可以了,对于第一列都某个服务器,如果它坏了的话,就会有第二列的补上,所以我们只需要构造两列,第一列就按照1-n循环排,然后对于每个服务器,如果这个服务器坏了的话,从未排全的数开排,如果等于这个服务器编号,跳一个即可。。
解题代码:
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 int a[1000][1000]; 5 int ths[1000][1000]; 6 int temp[1000]; 7 int main() 8 { 9 int n , m; 10 while(scanf("%d %d",&n,&m) != EOF) 11 { 12 memset(a,0,sizeof(a)); 13 14 memset(temp,0,sizeof(temp)); 15 memset(ths,0,sizeof(ths)); 16 int k; 17 for(int i = 1;i <= m;i ++) 18 { k = (i-1)%n+1; 19 a[i][1] = k; 20 ths[i][a[i][1]] = 1; 21 } 22 for(int i = 1;i <= n;i ++) 23 { 24 temp[i] = (k)%n + 1 ; 25 } 26 for(int i = 1;i <= m; i ++) 27 { 28 if(temp[a[i][1]] == a[i][1]) 29 temp[a[i][1]] = temp[a[i][1]]%n +1; 30 a[i][2] = temp[a[i][1]]; 31 ths[i][a[i][2]] = 1; 32 temp[a[i][1]] = temp[a[i][1]] % n + 1; 33 } 34 for(int i = 1;i <= m;i ++) 35 { 36 int be = 1; 37 for(int j = 3; j<= n;j ++) 38 { 39 while(ths[i][be] == 1) 40 be++; 41 a[i][j] = be; 42 ths[i][be] = 1; 43 } 44 } 45 for(int i = 1;i <= m;i ++) 46 { 47 for(int j = 1;j <= n;j ++) 48 printf(j == 1?"%d":" %d",a[i][j]); 49 printf(" "); 50 } 51 } 52 return 0 ; 53 }