CF459C Pashmak and Buses 打印全排列

这题如果将最终的结果竖着看,每一列构成的数可以看成是k进制的数,一共有d列,任意两列都不相同,所以这就是一个d位k进制数全排列的问题,一共有k ^ d个排列,如果k ^ d < n,则打印-1。

打印最终结果时设第一列就为1 1 1 1 ... 1,然后依次每列增加1后(公交车编号从1开始,不是从0开始) ,注意,这里是k进制。

#include <stdlib.h>
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <math.h>
using namespace std;

int tmpvalue[1001][1001];

int main()
{
#ifdef _DEBUG
	freopen("d:\\in.txt", "r", stdin);
#endif
	int n, k, d;
	scanf("%d %d %d", &n, &k, &d);
	if (k < n)
	{
		int total = 1;
		for (int i = 1; i <= d;i++)
		{
			total *= k;
			if (total >= n)
			{
				break;
			}
		}
		if (total < n)
		{
			printf("-1\n");
			return 0;
		}
	}
	for (int i = 1; i <= d;i++)
	{
		tmpvalue[i][1] = 1;
	}
	for (int i = 2; i <= n;i++)
	{
		for (int j = 1; j <= d;j++)
		{
			tmpvalue[j][i] = tmpvalue[j][i - 1];
		}
		tmpvalue[1][i] += 1;
		for (int j = 1; j <= d; j++)
		{
			if (tmpvalue[j][i] > k)
			{
				tmpvalue[j][i] = 1;
				tmpvalue[j + 1][i]++;
			}
			else
				break;
		}
	}
	for (int i = 1; i <= d;i++)
	{
		for (int j = 1; j <= n;j++)
		{
			printf("%d ", tmpvalue[i][j]);
		}
		printf("\n");
	}
	return 0;
}
时间: 2025-01-07 06:23:53

CF459C Pashmak and Buses 打印全排列的相关文章

打印全排列和stl::next_permutation

打印全排列是个有点挑战的编程问题.STL提供了stl::next_permutation完美的解决了这个问题. 但是,如果不看stl::next_permutation,尝试自己解决,怎么做? 很自然地,使用递归的办法: 1. 单个元素的排列只有1个. 2. 多个元素的排列可以转化为: 以每个元素为排列的首个元素,加上其他元素的排列. 有了思路,就可以编码了. 第一个版本: void printAllPermutations(const std::string& prefix, int set[

codeforce Pashmak and Buses(dfs枚举)

1 /* 2 题意:n个同学,k个车, 取旅游d天! 3 要求所有的学生没有两个或者两个以上的在同一辆车上共同带d天! 输出可行的方案! 4 5 对于d行n列的矩阵,第i行第j列表示的是第i天第j个同学所在的车号! 6 也就是保证所有行不全相同,即每一列都是不相同的! 7 如果每一列都不相同就是表示第j个同学(第j列)在这d天中不会和其他同学(列)在这d天中 都在同一辆车中! 8 9 思路:对于每一列我们枚举d天该学生所在的车号!它的下一列只保证有一个元素和它不同就行了!依次下去! 10 11

codeforces 459C - Pashmak and Buses 【构造题】

题目:codeforces 459C - Pashmak and Buses 题意:给出n个人,然后k辆车,d天时间,然后每天让n个人选择坐一辆车去上学,要去d天不能有任意两个人乘同一辆车,不能的话输出 -1 分类:数学,构造 分析:这个题目首先得分析,我开始想到的是首先用相同的放在一起,比如 7 2 3 这样构造 1 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 2 2 2 1 1 1 就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优

codeforces 459C Pashmak and Buses(模拟,组合数A)

题目 跑个案例看看结果就知道了:8 2 3 题目给的数据是 n,k,d 相当于高中数学题:k个人中选择d个人排成一列,有多少种不同的方案数,列出其中n中就可以了. #include<iostream> #include<algorithm> #include<string> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h>

打印全排列思路

从n个不同的元素中取m个元素(m<=n),按照一定的顺序排列起来, 叫做从n个不同元素取出m个元素的一个排列. 当m=n时,所有的排列情况叫做全排列,比如3的全排列为: 1 2 3 1 3 2 2 1 3 2 3 1 3 1 2 3 2 1 我们先从简单的开始,要求写出代码打印上面的排列情况即可,顺序可以不一致. 分析过程: 首先,我们如何把三位的数字打印出来呢,有两种方式: printf("%d\n" ,num); //num=123 第二种: printf("%d%

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

题目链接 题意: n个人,k个车,d天.每一个人每天能够坐随意一个车.输出一种情况保证:不存在两个人,每天都在同一辆车上 (1?≤?n,?d?≤?1000; 1?≤?k?≤?109). 分析: 比赛中用的方法麻烦至极...基本想法是均分,这样答案肯定比較优.第一天分到同一辆车上的人在第二天再均分,一直到结束就可以 学习了别人的方法:一个人在所有d天中每天坐哪辆车,能够表示为d位k进制数x. 那么2个人每天都在同一辆车上,就是两个人的x相等.所以我们仅仅要构造出n个不同的d位k进制数即可 这种方法

Codeforces 459C Pashmak and Buses 机智数学题

这个题目说的是有n个人,有k辆巴士,有m天,每天都要安排n个人坐巴士(可以有巴士为空),为了使得这n个人不会成为朋友,只要每两个人在这m天里坐的巴士至少一天不相同即可. 要你求是否有这样的安排方法,如果有,输出具体的安排方案,每个人每天坐那辆车. 挺不错的题目,我压根没想到..真的,虽然知道之后惊呼原来如此简单,但一开始确实想岔了.现在一看这题目,很清晰,每个学生在这m天中坐的车辆,就会形成一个由m个数字组成的序列(数字为1-k代表巴士编号),按照题目要求,只需要学生的那个序列是独一无二的即可.

JAVA求解全排列

一,问题描述 给定一个字符串,求出该字符串的全排列. 比如:"abc"的全排列是:abc.acb.bac.bca.cab.cba 二,实现思路 采用递归的方式求解.每次先选定一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来.至此,一趟全排列完成.第二趟,选定下一个字符,然后进行“若干次”交换,求出在选定这个字符的条件下,所有的全排列,并把字符“复位”再交换回来...... 就类似于:(参考网上的解释如下:) 设R={r1,r2,..

输出全排列缺少的字符串

时间间限制:1000ms题目描述:对K个不同字符的全排列组成的数组, 面试官从中随机拿走了一个, 剩下的数组作为输入, 请帮忙找出这个被拿走的字符串?比如["ABC", "ACB", "BAC", "CAB", "CBA"] 返回 "BCA" 输入描述:第一行输入整数n,表示给定n个字符串.(n == x!-1,2<=x<=10)以下n行每行输入一个字符串. 输出描述:输出全