题意:三种物品分别有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. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. Android 在线订单倒计时设计

        接到一个需求,用户下单后,商店这边需要显示在线订单列表,订单十分钟内有效.于是需要设计倒计时,显示每个订单剩余处理时间.       倒计时剩余时间: 订单创建时间 + 10分钟  - 系统当 ...

  3. 【IT】公司FTP服务器使用说明

    FTP服务器的作用:----------------------------------------------1.员工个人或者部门资料临时备份(而不是永久归档): 2.部门或员工间交换巨大资料: 3 ...

  4. WPF学习系列 绘制旋转的立方体

    我是一年经验的web程序员,想学习一下wpf,比较喜欢做项目来学习,所以在网上找了一些项目,分析代码,尽量能够做到自己重新敲出来 第一个项目是 中间的方块会不停的旋转. 第一步,新建wpf项目 第二步 ...

  5. POJ 1321 棋盘问题(dfs)

    传送门 棋盘问题 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 38297   Accepted: 18761 Descri ...

  6. 响应式布局-Rem的用法

    前言: 文章较为系统地介绍了rem这个新的文字大小单位,绝对干货,绝对好文.转载时略有改动.   先来看看一些基本理念,比如: 响应式网页不仅仅是响应不同类型的设备,而且需要响应不同的用户需求.响应式 ...

  7. CCS5.2/CCS5.3/CCS5.4 仿真调试小技巧

    操作系统: WinXP 32bit 仿真器: SEED-XDS560 Plus 开发环境: DSP.com/forum.php?mod=forumdisplay&fid=58" ta ...

  8. validate表单验证插件

    1.引入validate.js包 <script src="xx/xx/jquery.validate.min.js"></script> 2.表单验证 / ...

  9. 通过设置CSS属性让DIV水平居中

    通过设置CSS属性让DIV水平居中 ---------------------- <html> <head> <title></title> <m ...

  10. UP Board 超详细开箱评测

    前言 原创文章,转载引用务必注明链接. 江浙沪就是好,昨天发货今天收到.另外爱板太省了,外包装小纸箱还是6s钢化膜的重复利用. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议 ...