题意:三种物品分别有a b c个(a<=b<=c),现在每种物品各选一个进行组合。要求每种最和最多出现一次。且要求任意两个物品的组合在所有三个物品组合中的出现总次数不能超过n。

要求给出一个方案,使得我们能够生成的组合数最多。

分析:

首先我们可以简单的处理一种情况,就是c<=n的情况。

因为我们枚举出了所有组合,那么两物品的出现次数的最大值不会超过c,因为A种和B种的每对组合都会在其中出现c次,其余两个的组合出现次数更少。

所以这种情况一定不会超过n,我们只需要枚举所有组合即可。

然而,对于c>n的情况,如果我们对每个AB物品对枚举n次,

我们必须合理分配如何给这些AB对指定对应的C物品,否则AC或者BC物品对就有可能超越n次。所以这个问题不是很简单就能解决的。

无论怎么枚举,我们的总组合数不可能超过a×b×n。否则必然导致某些AB物品的出现次数超过n。

又因为a b都小于c,所以a*b*n就是我们所求答案的上界。

现在有一个构造方法可以保证对于任意的c>n的情况,构造出一种a*b*n的合法组合数。

方法就是构造一个长宽高分别是abc的由1×1×1小正方体堆叠而成的立方体,其中每个小正方体其坐标都对应了一个三物品组合,

我们要从中选出最多的正方体来。

而n的限制则可以形象表示为每x、y、z轴方向的行中选中的正方体数量都不能超过n。

我们先来构造a=1的这个平面的正方体。在b=1这一行的c个正方体里,我们选取1~n(n<c)的正方体加入答案。

而随着b的增长,我们将这个选取区间依次向右平移。b=x时选x~(n+x)%c。由于b<c所以这个区间最多完成一次平移循环。

对于a=1这个平面里,每行每列都不会超过n个被选中的。

接下来我们来构建每个b=x的平面,有b个这样的平面。

对于每个平面,方法与之前相同,对于a=1的一行我们选择1~n区间,随着a增长,区间也进行平移。

对于a=y这一行,选择区间为y~(n+y)%c。与之前同理,一定合法。

现在保证了所有c方向的行中,选中数量小于等于n。a方向的行中选中数量小于等于n。但是b方向的行中,我们只保证了在a=1这个平面内的小于等于n。

但是不用担心,因为其余的b方向的是合法的,因为我们的构建方法,相当于将a=1这个平面随着a的增长而向b方向进行平移。

这样就构建完成了,找到这样构建的被选中正方体的坐标规律,输出即可。

#include <cstdio>
#include <algorithm>
using namespace std; int a, b, c, n; void work()
{
if (c <= n)
{
printf("%d\n", a * b * c);
for (int i = ; i <= a; i++)
for (int j = ; j <= b; j++)
for (int k = ; k <= c; k++)
printf("%d %d %d\n", i, j, k);
return;
}
printf("%d\n", a * b * n);
for (int i = ; i < a; i++)
for (int j = ; j < b; j++)
for (int k = i + j; k < i + j + n; k++)
{
printf("%d %d %d\n", i + , j + , k % c + );
}
} int main()
{
int t;
scanf("%d", &t);
int case_num = ;
while (t--)
{
case_num++;
printf("Case #%d: ", case_num);
scanf("%d%d%d%d", &a, &b, &c, &n);
work();
}
return ;
}

Google Code Jam 2016 Round 1C C的更多相关文章

  1. Google Code Jam 2010 Round 1C Problem A. Rope Intranet

    Google Code Jam 2010 Round 1C Problem A. Rope Intranet https://code.google.com/codejam/contest/61910 ...

  2. Google Code Jam 2010 Round 1C Problem B. Load Testing

    https://code.google.com/codejam/contest/619102/dashboard#s=p1&a=1 Problem Now that you have won ...

  3. Google Code Jam 2016 Round 1B Problem C. Technobabble

    题目链接:https://code.google.com/codejam/contest/11254486/dashboard#s=p2 大意是教授的学生每个人在纸条上写一个自己的topic,每个to ...

  4. Google Code Jam 2016 Round 1B B

    题意:给出两个数字位数相同,分别中间有若干位不知道,用问号表示.现在要求补全这两个数字,使得差值的绝对值最小,多解则取第一个数字的值最小的,再多解就取第二个数字最小的. 分析: 类似数位dp,但是很多 ...

  5. Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  6. [C++]Store Credit——Google Code Jam Qualification Round Africa 2010

    Google Code Jam Qualification Round Africa 2010 的第一题,很简单. Problem You receive a credit C at a local ...

  7. [Google Code Jam (Qualification Round 2014) ] B. Cookie Clicker Alpha

    Problem B. Cookie Clicker Alpha   Introduction Cookie Clicker is a Javascript game by Orteil, where ...

  8. [Google Code Jam (Qualification Round 2014) ] A. Magic Trick

    Problem A. Magic Trick Small input6 points You have solved this input set.   Note: To advance to the ...

  9. [C++]Saving the Universe——Google Code Jam Qualification Round 2008

    Google Code Jam 2008 资格赛的第一题:Saving the Universe. 问题描述如下: Problem The urban legend goes that if you ...

随机推荐

  1. 【BZOJ 3876】【AHOI 2014】支线剧情

    http://www.lydsy.com/JudgeOnline/problem.php?id=3876 这道题每条支线的意思是每条边... 那么每条边的下界设为1就行了. 这样建出一个DAG,每条边 ...

  2. 常用的一些linux命令

    最近接触到一些linux环境部署的事情,下面分享一些最近使用的比较频繁的一些linux命令~ 1.一次性移动多个文件到一个文件夹里 mv  被移动文件名 -t 目标文件夹 如:mv a.txt b.t ...

  3. jQuery Mobile入门

    转:http://www.cnblogs.com/linjiqin/archive/2011/07/17/2108896.html 简介:jQuery Mobile框架可以轻松的帮助我们实现非常好看的 ...

  4. iOS事件传递->处理->响应

    前言: 按照时间顺序,事件的生命周期是这样的: 事件的产生和传递(事件如何从父控件传递到子控件并寻找到最合适的view.寻找最合适的view的底层实现.拦截事件的处理)->找到最合适的view后 ...

  5. mac 10.11.6 自带apache配置记录

    详细记录使用自带apache的一些问题 开启apache服务 作为2016年的新版本os,在系统偏好设置里没有网络共享了,所以可以通过终端,直接开启apache服务器: 开启apache:sudo a ...

  6. shell脚本自动拉起启动程序

    一.我们先看看编写的shell脚本的内容,该shell的作用主要是实现监控某个程序崩溃之后就自动重启该进程. while true do procnum=` ps -ef|grep "tes ...

  7. (转载)哈夫曼编码(Huffman)

    转载自:click here 1.哈夫曼编码的起源: 哈夫曼编码是 1952 年由 David A. Huffman 提出的一种无损数据压缩的编码算法.哈夫曼编码先统计出每种字母在字符串里出现的频率, ...

  8. console 输出信息美化

    不久前在一些前端的网站上看到的效果,以前觉得console只是拿来做做调试,不过现在看到别人网站的console美化效果,这个还可以作为一种网站个性来显示的.. 以%c开头,后面的文字就打印的信息,后 ...

  9. 【原】小搞一下 javascript算法

    前言:在前端大全中看到这句话,以此共勉.基础决定你可能达到的高度, 而业务决定了你的最低瓶颈 其实javascript算法在平时的编码中用处不大,不过不妨碍我们学习它,学习一下这些算法的思想,锻炼一下 ...

  10. [转]mysql 视图

    转载自http://blog.csdn.net/evankaka/article/details/47071133 一. 视图概述 视图是一个虚拟表,其内容由查询定义.带来许多好处: 1. 视图能简化 ...