题意:题目真难懂 自行理解。。。
解题思路:其实只要考虑两列就可以了,对于第一列都某个服务器,如果它坏了的话,就会有第二列的补上,所以我们只需要构造两列,第一列就按照1-n循环排,然后对于每个服务器,如果这个服务器坏了的话,从未排全的数开排,如果等于这个服务器编号,跳一个即可。。
解题代码:
1 #include2 #include 3 #include 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("\n");50 }51 }52 return 0 ;53 }