题意:三种物品分别有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. 【MySQL】函数IFNULL、设置默认时间

    MySql 函数 IFNUll用法说明 IFNULL(expr1,expr2) 如果 expr1 不是 NULL,IFNULL() 返回 expr1,否则它返回 expr2. IFNULL()返回一个 ...

  2. JFinal 项目 在tomcat下部署

    原文:http://my.oschina.net/jfinal/blog/353062 首先明确一下 JFinal 项目是标准的 java web 项目,其部署方式与普通 java web 项目没有任 ...

  3. jquery网页可见区域宽

    网页可见区域宽:document.body.clientWidth 网页可见区域高:document.body.clientHeight 网页可见区域宽:document.body.offsetWid ...

  4. tensorflow 一些好的blog链接和tensorflow gpu版本安装

    pading :SAME,VALID 区别  http://blog.csdn.net/mao_xiao_feng/article/details/53444333 tensorflow实现的各种算法 ...

  5. 样式重置 css reset

    新浪的初始化: html,body,ul,li,ol,dl,dd,dt,p,h1,h2,h3,h4,h5,h6,form,fieldset,legend,img { ; padding: 0 } fi ...

  6. JSP和Servlet的中文乱码处理

    JSP和Servlet的中文乱码处理 前几天学习了JSP和Servlet中有关中文乱码的一些问题,写成了博客,今天进行更新一下.应该是可以解决日常的乱码问题了.现在作以下总结希望对需要的人有所帮助.我 ...

  7. 基于Dubbo框架构建分布式服务(三)

    我们将上面开发的服务提供方服务,部署到2个独立的节点上(192.168.14.1和10.10.4.125),然后可以通过Dubbo管理中心查看对应服务的状况,如图所示: 上图中可以看出,该服务有两个独 ...

  8. 基于Dubbo框架构建分布式服务(一)

    Dubbo是Alibaba开源的分布式服务框架,我们可以非常容易地通过Dubbo来构建分布式服务,并根据自己实际业务应用场景来选择合适的集群容错模式,这个对于很多应用都是迫切希望的,只需要通过简单的配 ...

  9. SocketServer

    SocketServer是基于socket写成的一个更强大的模块. SocketServer简化了网络服务器的编写.它有4个类:TCPServer,UDPServer,UnixStreamServer ...

  10. jshint字段的意义

    1.安装jshint插件    npm install jshint -g 2.在需要对JS进行语法检测的文件上一层目录添加.jshintrc文件 .jshintrc是一个对象,类似: { " ...