BNU 0814 C The Captain's Squad

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……



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值