1009: 公交車
時間限制: 1 Sec 內存限制: 128 MB
題目描述
最近pashmak被運輸公司錄用了,公司有k輛車,現在有個學校n個學生要用車,學校要將這些學生送到d個不同地方,每個地方呆1天,總共要d天。每天公司要提供車運輸這些學生,pashmak就要安排方案。學校爲了防止這些學生太過親密,不希望有任意兩個學生d天內都是同一輛車。問pashmak能否合理安排。
注意,我們假設每輛車的容量是無限的。
輸入
輸入3個數,n, k, d (1 <= n, d <= 1000; 1 <= k <= 10 ^9)
輸出
如果可以輸出”yes”
然後輸出n行,每行d個數,每行輸出每個人的安排車輛(車輛編號是從1到k)
方案有多種,這裏要求輸出字典序最小的一種
不可以輸出”no”
樣例輸入
3 2 2
樣例輸出
yes
1 1
1 2
2 1
提示
輸入
3 2 1
輸出
no
來源
cf459C
這道題可以簡化爲k^d與n的關係
如果小於,那麼輸出no
不然就輸出yes
輸出方案很簡單
先將一個a數組全賦值爲1
然後從尾部不斷加一
維護k進制即可
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
int n,k,d;
int a[1005];
int main()
{
scanf("%d%d%d",&n,&k,&d);
ll kd=1;
for (int i=1;i<=d;i++)
{
kd=kd*k;
if (kd>=n) break;
}
if (kd<n)
{
printf("no\n");
return 0;
}
printf("yes\n");
for (int j=1;j<=d;j++)
a[j]=1;
for (int i=1;i<=n;i++)
{
for (int j=1;j<d;j++)
printf("%d ",a[j]);
printf("%d\n",a[d]);
int x=d;
a[x]++;
while (a[x]>k)
{
a[x--]=1;
a[x]++;
}
}
return 0;
}