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

就是需要的天数跟每一行出现次数最多的数的出现次数相等,但是发现还有更优的方法,可以找到最多次数-1的方案

这样构造1 2 1 2 1 2 1

1 1 2 2 1 1 2

1 1 1 1 2 2 2

那么是怎样得到的呢?

这其实可以用构造数的原理,我们把每一列从下往上看成一个 k 进制的长度为 d 的数,然后构造这样的 n 个数就好了,其实很简单,直接从0开始枚举到n-1,然后每个数+1,就是结果。

那么判断不满足条件的就很简单了,k^d < n 的话,肯定没办法构造出来,注意会超int

当然可以用深搜来枚举所有可能的情况,来构造,方法差不多

代码:python

n,k,d = map(int,raw_input().split())
if(n> k**d):
    print -1
else:
    ans = []
    for  i in range(n):
        tmp = i;
        cur = []
        for j in range(d):
            cur.append(tmp%k+1)
            tmp/=k
        ans.append(cur)
    for i in range(d):
        for j in ans:
            print j[i], #没有换行输出
        print ('\n')

c++

#include <cstdio>
#include <cstring>
#include <string>
#include <queue>
#include <stack>
#include <map>
#include <vector>
#include <iostream>
#include <algorithm>
#include <cmath>
#include <set>
#include <utility>
#define Del(a,b) memset(a,b,sizeof(a))
const int N = 1200;
using namespace std;
int a[N][N];
int main()
{
    int n,k,d;
    while(~scanf("%d%d%d",&n,&k,&d))
    {
        if(double(n)>pow((double)k,d))
            printf("-1\n");
        else
        {
            Del(a,0);
            for(int st=0;st<n;st++)
            {
                int tmp=st,j=0;
                while(tmp)
                {
                    a[j][st]=tmp%k;
                    tmp/=k;j++;
                }
            }
            for(int i=0;i<d;i++)
            {
                for(int j=0;j<n;j++)
                {
                    printf("%d%c",a[i][j]+1,j==n?'\n':' ');
                }
                printf("\n");
            }
        }
    }
    return 0;
}

codeforces 459C - Pashmak and Buses 【构造题】,布布扣,bubuko.com

时间: 2024-10-26 17:16:20

codeforces 459C - Pashmak and Buses 【构造题】的相关文章

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>

Codeforces 459C Pashmak and Buses 机智数学题

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

CodeForces 26C Parquet 构造题

题目链接:点击打开链接 #include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <math.h> #include <set> using namespace std; #define N 105 int n,m,a,b,c; char s[N][N]; set<char>myset; bool inm

[短期持续更新]Codeforces 构造题一览

说实话我觉得做这种题很没意思(不够硬核), 可是人有短板终究是要补的...起码这种类型补起来相对简单 所以还是把先前准备好的专题放下吧,做点实现上比较休闲的题 ps.为了精简篇幅,代码全部丢到ubuntu上 Codeforces - 483C 题意:给定\(k\),构造\(n\)的某一排列\(p\)满足\(|p_i-p_{i+1}|\)共有\(k\)种不同的值 做法:当\(k\)为\(n-1\)时,分奇偶前后插可满足情况,\(k<n-1\)时从\(k\)处开始排序可消除差异 https://pa

B - Save the problem! CodeForces - 867B 构造题

B - Save the problem! CodeForces - 867B 这个题目还是很简单的,很明显是一个构造题,但是早训的时候脑子有点糊涂,想到了用1 2 来构造, 但是去算这个数的时候算错了... 用1 2 来构造 可以先枚举一些数来找找规律. 1 1 2 2 3 1 1 1    2 1 1 4 .... 可以发现每一个数都是 n/2+1 的可能, 所以反过来推过去就是 (s-1)*2  或者(s-1)*2+1 这个(s-1)*2+1的答案才是正确答案 因为 这个s可以==1 #i

Codeforces 482 - Diverse Permutation 构造题

这是一道蛮基础的构造题. - k         +(k - 1)      -(k - 2) 1 + k ,    1 ,         k ,             2,    ................... \  /        \  /           \  / k          k-1          k-2 如图所示,先构造第一个数,就是1 + k, 然后接下来每个数字和上个数相差k , k -1 , k -2 这样下来,最后一个数字就是一个中间的数字,过程就

Codeforces 459C

构造题 最多可以是k的d次方的学生不成为朋友 循环节的长度以k为倍数翻倍 注意long long #include<iostream> #include<cstdio> #include<cstdlib> #include<string.h> #include<math.h> #include<algorithm> #include<vector> #include<queue> using namespace

Codeforces Round #634 (Div. 3) 补题

A. Candies and Two Sisters 签到题,直接输出即可 代码 #include<bits/stdc++.h> #define INF 0x3f3f3f3f typedef long long ll; using namespace std; inline void read(int &p) { p=0;int flag=1;char c=getchar(); while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();} w

HDU 5402 (构造题) Travelling Salesman Problem

题意 略. 思路 比赛的时候其实已经意识到是一个构造题了. 蓝儿m,n都是偶数的时候搞崩了.sad.. m,n有一个是奇数不说了,可以走完所有. 两个都是偶数的时候,我们就去找一个最小的值且它的位置坐标和是奇数,然后就绕开这个走.其他都可以走完辣. 参考code: /* #pragma warning (disable: 4786) #pragma comment (linker, "/STACK:0x800000") */ #include <cassert> #incl