博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Google Code Jam 2016 Round 1C C
阅读量:6087 次
发布时间:2019-06-20

本文共 1867 字,大约阅读时间需要 6 分钟。

题意:三种物品分别有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 
#include
using namespace std;int a, b, c, n;void work(){ if (c <= n) { printf("%d\n", a * b * c); for (int i = 1; i <= a; i++) for (int j = 1; j <= b; j++) for (int k = 1; k <= c; k++) printf("%d %d %d\n", i, j, k); return; } printf("%d\n", a * b * n); for (int i = 0; i < a; i++) for (int j = 0; j < b; j++) for (int k = i + j; k < i + j + n; k++) { printf("%d %d %d\n", i + 1, j + 1, k % c + 1); }}int main(){ int t; scanf("%d", &t); int case_num = 0; while (t--) { case_num++; printf("Case #%d: ", case_num); scanf("%d%d%d%d", &a, &b, &c, &n); work(); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/rainydays/p/5533530.html

你可能感兴趣的文章
编写更好的C#代码
查看>>
【数据库设计-1.1】关系的实现
查看>>
UVa 10285 - Longest Run on a Snowboard
查看>>
Android设备管理器漏洞2--禁止用户取消激活设备管理器
查看>>
codeforces Gym 100187A A. Potion of Immortality
查看>>
2016校招内推 -- 腾讯SNG前端 -- 面试经历
查看>>
HDU 4125 Moles 段树+KMP
查看>>
Apache2.2+Tomcat7.0整合配置详解
查看>>
Android程序的入口点
查看>>
嵌套怀疑条件运算符和一个逗号,大神寻求答案(自愿解决)
查看>>
50、Toast自定义布局
查看>>
STM32F4 Timer simplified block diagram
查看>>
python安装
查看>>
poj 1979 Red and Black(dfs水题)
查看>>
javascript与java编码互转
查看>>
【C++】类的特殊成员变量+初始化列表
查看>>
pip安装使用详解
查看>>
数学 - Codeforces Round #319 (Div. 1)A. Vasya and Petya's Game
查看>>
ExtJs--02--MessageBox相关弹出窗口alert,prompt,confirm采用
查看>>
滴滴快车奖励政策,高峰奖励,翻倍奖励,按成交率,指派单数分级(9月7日~9月13日)...
查看>>