Codeforces 459C.Pashmak and Buses

本文解析了Codeforces竞赛中一道关于学生分配到车辆的问题。通过使用k进制数和分治策略,确保了n个学生在d次分配中不会连续与同一组学生在同一辆车上。代码实现展示了如何通过递归生成所有可能的分配方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://codeforces.com/contest/459/problem/C

题意:有n个学生,k辆车,n个学生分到k辆车中d次,两个同学d次不能一直在同一辆车里。

分析:很难想,k进制+分治。每次将n平均分成k份,分d次。第一次分成k组,第二次分成k^2组,第三次分成k^3组,最后只要保证k^d > n即可。因为k^d就是长度为d的k进制数的所有情况,对应每一行就有这么多的分类,按列枚举即可。

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int tt[1010],cnt,r,ans[1010][1010];
ll n,k,d;
void dfs(int pos)
{
    if(pos == d + 1)
    {
        cnt++;
        for(int i = 1; i <= d; i++)
        {
            ans[i][cnt] = tt[i];
        }
//         for(int i = 1; i <= d; i++)
//        {
//            printf("%d ",ans[cnt][i]);
//        }
//        printf("%d\n",cnt);
        return;
    }
    for(int i = 1; i <= k; i++)
    {
        tt[pos] = i;
        dfs(pos + 1);
        if(cnt >= n)break;
    }
}
int main()
{

    cin>>n>>k>>d;
    ll tmp = 1;
    for(int i = 1; i <= d; i++)
    {
        tmp *= k;
        if(tmp >= n)break;
    }
    if(tmp < n){printf("-1\n");return 0;}
    dfs(1);
    for(int i = 1; i <= d; i++)
    {
        for(int j = 1; j <= n; j++)
        {
            if(j == 1)printf("%d",ans[i][j]);
            else printf(" %d",ans[i][j]);
        }
        printf("\n");
    }
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值