题目链接:点击打开链接
题意:有n个学生,要一起乘坐k辆校车d天,要求不能存在两个学生这d天中每天都在一辆车上。
看似很复杂,实际上就是一句话——构造n个d位的k进制数。
d位k进制数最多有k^d个,先判断是否大于n,然后构造。
开始判断时没加退出条件,如果d很大的话会溢出。。wa了n次。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,d,k;
int a[1010][1010];
void solve(){
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
int t=i,cur=0;
while(1){
if(t<k){
a[i][cur]=t;
break;
}
a[i][cur++]=t%k;
t/=k;
}
}
}
int main(){
while(cin>>n>>k>>d){
int t=1;
for(int i=1;i<=d;i++){
t*=k;
if(t>=n) break;
}
if(t<n){
cout<<-1<<endl;
continue;
}
solve();
int i,j;
for(i=0;i<d;i++){
for(j=0;j<n-1;j++){
cout<<a[j][i]+1<<" ";
}
cout<<a[n-1][i]+1<<endl;
}
}
return 0;
}