这个题目说的是有n个人,有k辆巴士,有m天,每天都要安排n个人坐巴士(可以有巴士为空),为了使得这n个人不会成为朋友,只要每两个人在这m天里坐的巴士至少一天不相同即可。

要你求是否有这样的安排方法,如果有,输出具体的安排方案,每个人每天坐那辆车。

挺不错的题目,我压根没想到。。真的,虽然知道之后惊呼原来如此简单,但一开始确实想岔了。现在一看这题目,很清晰,每个学生在这m天中坐的车辆,就会形成一个由m个数字组成的序列(数字为1-k代表巴士编号),按照题目要求,只需要学生的那个序列是独一无二的即可。

那么,我们只要把题意转化为 求n个不同的m个数字组成的序列(只要有一个数字不同即为不同),那么我们把这个序列,认为是一个 m位的k进制的数不就行了,每次从111111.。

开始枚举,一直枚举到kkkkkk。。。结束啊啊。。。哎,真的很机智的题诶

当然一开始可以直接乘一下判断m个k进制的数是否>=n,不满足直接输出-1,满足就用类似高精度加法把序列求出来再输出即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define LL __int64
using namespace std;
LL n,k,d;
int ans[][];
int main()
{
while (scanf("%I64d%I64d%I64d",&n,&k,&d)!=EOF)
{
LL tmp=k;
for (LL i=;i<=d;i++){
tmp=tmp*k;
if (tmp>=n) break;
}
if (tmp<n){
puts("-1");
continue;
}
for (int i=d;i>=;i--) ans[][i]=;
ans[][d]=;
for (int i=;i<=n;i++){
int c=;
ans[i][d]=ans[i-][d]+;
if (ans[i][d]>k){ans[i][d]=;c++;}
for (int j=d-;j>=;j--){
ans[i][j]=ans[i-][j]+c;
if (ans[i][j]>k){
c=;
ans[i][j]=;
}
else c=;
}
}
for (int i=;i<=d;i++){
printf("%d",ans[][i]);
for (int j=;j<=n;j++){
printf(" %d",ans[j][i]);
}
puts("");
}
}
return ;
}

最新文章

  1. Revolving Digits(hdu 4333)
  2. Course Schedule I &amp; II
  3. knockout 学习实例4 css
  4. custom struts framework
  5. python实现简单爬虫抓取图片
  6. 递推DP URAL 1119 Metro
  7. editplus的各式插件
  8. Java正则表达式之语法规则
  9. find &amp; rm
  10. Cocos2d-x 3.0 红孩儿私家必修 - 第二章 cpp-empty-test
  11. HDU2222 Keywords Search(AC自动机)
  12. spin.js无图片实现loading进度条,支持但非依赖jquery
  13. 无法从带有索引像素格式的图像创建graphics对象(转)
  14. 【学习笔记01】:hover为DIV添加鼠标悬停时改变颜色的效果
  15. 实现拦截API的钩子(Hook)
  16. Attribute Routing
  17. python基础二(基础数据类型)
  18. [SCOI2009]生日快乐
  19. Android 手机版 ssr
  20. (转)Linux的用户和用户组管理

热门文章

  1. Qt中QListWidget的verticalScrollMode选项设置为ScrollPerPixel无效果的原因
  2. 微信小程序(基础)
  3. nth-of-type()的用法
  4. 本地模拟内存溢出并分析Dump文件
  5. 前端学习笔记系列一:6 一种新的css预编译器stylus
  6. Java注解浅谈
  7. 树莓派学习笔记——Restful服务 采用slim php apache
  8. C# 创建INI文件,写入并可读取。----转载
  9. I2S 总线学习:2-I2S驱动WM8978
  10. Codeforces 546 E:士兵的旅行 最大网络流