Google Code Jam 2016 Round 1C C
题意:三种物品分别有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的更多相关文章
- 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 ...
- 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 ...
- Google Code Jam 2016 Round 1B Problem C. Technobabble
题目链接:https://code.google.com/codejam/contest/11254486/dashboard#s=p2 大意是教授的学生每个人在纸条上写一个自己的topic,每个to ...
- Google Code Jam 2016 Round 1B B
题意:给出两个数字位数相同,分别中间有若干位不知道,用问号表示.现在要求补全这两个数字,使得差值的绝对值最小,多解则取第一个数字的值最小的,再多解就取第二个数字最小的. 分析: 类似数位dp,但是很多 ...
- 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. ...
- [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 ...
- [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 ...
- [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 ...
- [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 ...
随机推荐
- string常用函数
1.addslashes($str); //转义时str中的所有特殊字符 stripslashes($str) //还原 2.bin2hex($str); //将2进制转成16进制 3. echo c ...
- MySQL种种
mysql中You can't specify target table for update in FROM clause错误--http://blog.csdn.net/priestmoon/ar ...
- Android 解析聊天表情的笔记
应用需要用到聊天功能,考虑到开始需求不大,暂时先用第三方的. 一研究发现界面风格有点不符合整体的风格,加上需要一些自己的特定的需求和界面显示,于是就决定调用第三方数据接口,界面自己写.功能只需要文字, ...
- oracle存储过程
1.存储过程定义 储存程序 (Stored Procedure),又可称预储程序或者存储过程,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序.-- ...
- 关于input的file框onchange事件触发一次失效的新的解决方法
在google了众多方法后,网上有这么几种方法: 1.替换掉原来的input框 2.remove原来的input框,然后在添加进新的一样的input框 但是不知道为什么非常不幸的是,怎么弄我都弄不出. ...
- Beta版本冲刺第五天
Aruba 408 409 410 428 429 431 完成任务: 数据库对于分类新建/删除的更新 调整图片再编辑界面的合适大小 调整常驻通知栏按钮的跳转逻辑 微调数据库 立会照片: 燃尽图: c ...
- COGS732. [网络流24题] 试题库
«问题描述:假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性.现要从题库中抽取m 道题组成试卷.并要求试卷包含指定类型的试题.试设计一个满足要求的组卷算法.«编程任务: ...
- C#之类的使用
属性与字段的使用类似iOS class Class1 { //字段私有,属性公有 private string _name; private int _age; /*control + r -> ...
- RabbitMQ学习系列(三): C# 如何使用 RabbitMQ
上一篇已经讲了Rabbitmq如何在Windows平台安装,还不了解如何安装的朋友,请看我前面几篇文章:RabbitMQ学习系列一:windows下安装RabbitMQ服务 , 今天就来聊聊 C# 实 ...
- 第4天--linux内核学习
驱动使用方式1.编译到内核中 * make uImage进入到系统后mknod /dev/led c 500 0 创建设备节点 2.编译为模块 M make module进入到系统后 mknod /d ...