错成那样,还以为是卡时间卡精度的变态题,结果就那么ac了= = 悔死我了
题意就不概述了,只要处理前两列即可。其中第一列顺序直接扫一遍,第二列要先处理较少的那几种。我是接着第一列用 head[] 继续处理,朋友给出了直接逆向处理的算法,更快、代码也会好写一点。
1 #include<cstdio> 2 #include<cstring> 3 #include<algorithm> 4 using namespace std; 5 6 const int MAXN=101; 7 int st[MAXN],ed[MAXN],head[MAXN]; 8 9 int main() 10 { 11 int n,m; 12 while(~scanf("%d%d",&n,&m)) 13 { 14 for(int i=0;i<m;i++) 15 st[i]=i%n+1; 16 int mod=m%n; 17 memset(head,0,sizeof(head)); 18 for(int i=1;i<=m;i++) 19 head[i]=mod; 20 for(int i=1;i<=n;i++) 21 { 22 for(int j=0;j<m;j++) 23 { 24 if(st[j]==i){ 25 if((head[i])%n+1!=st[j]){ 26 ed[j]=(head[i])%n+1; 27 head[i]++; 28 }else { 29 ed[j]=(head[i]+1)%n+1; 30 head[i]+=2; 31 } 32 } 33 } 34 } 35 for(int i=0;i<m;i++) 36 { 37 printf("%d %d",st[i],ed[i]); 38 for(int j=1;j<=n;j++) 39 if(j!=st[i]&&j!=ed[i]) 40 printf(" %d",j); 41 printf(" "); 42 } 43 } 44 return 0; 45 }