Codeforces Round #261 (Div. 2) C. Pashmak and Buses

题目链接:点击打开链接

题意:有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;
}








你可能感兴趣的:(构造)