Ufa SATU contest. Petrozavodsk training camp. Summer 2009
!!!!【非完全原创……师兄的想法】
❤题意:
每天要安排三个人值班。但是每两个人不能同时出现三次,会掐架。【掐毛毛架啊】
求安排值班表,符合题意的安排最多能安排值班多少天。
输出天数\n。
输出每天值班的三个人。
❤思路:
ans=Cn 2 *3/3;
【从n个人里任选2个人,一共可以出现3次,但是每天要抽出三个人值班】
轮换?
例如5个人
1:(1,2,3) (2,3,4) (3,4,5) (4,5,1) (5,1,2)
2:(1,3,5) (2,4,1) (3,5,2) (4,1,3) (5,2,4)
.
.
(n-1)/2:(1,1+(n-1)/2,1+(n-1)) ……………………(5,5+(n-1)/2,5+(n-1))
表示我为了省事儿,省得i循环回来查找,就直接在存a[0]~a[n-1]的时候,从a[n]开始同时存上与a[0]~a[n-1]相等的值。
这样直接加上即使算到第n个,也可以直接加上(n-1)/2。
#include<stdio.h>
int a[200];
int main(){
int n;
int x;
scanf("%d",&n);
int i=0;
while(i<n){
a[i]=i+1;
a[n+i]=i+1;
i++;
}
int ans=n*(n-1)/2;
int j,k;
int m=(n-1)/2;
printf("%d\n",ans);
for(j=1;j<=m;j++){
for(k=0;k<n;k++){
printf("%d %d %d\n",a[k],a[k+j],a[k+2*j]);
}
}
return 0;
}
❤总结:
场上太激动了。
直接YY出了公式,虽然不知道原理。【后来师兄讲了】
但是,完全不知道怎么排列,怎么输出,so悲剧了。
其实样例虽然很水,可
1 2 3
2 3 1
3 1 2
已经给予了提示。
But 当时除了让我疑惑,为什么是这样的输出 && 怀疑自己读题读错了,压根就没让我想到这种排列方式。
…… T T……