题面

你想从

N

N

N 个候选人中选 3 个人。

每个人有五个属性

A

i

,

B

i

,

C

i

,

D

i

,

E

i

A_i,B_i,C_i,D_i,E_i

Ai​,Bi​,Ci​,Di​,Ei​。

一种选人方案假设选了三个人

x

,

y

,

z

x,y,z

x,y,z ,那么这个方案的力量Strength就是

min

{

max

{

A

x

,

A

y

,

A

z

}

max

{

B

x

,

B

y

,

B

z

}

max

{

C

x

,

C

y

,

C

z

}

max

{

D

x

,

D

y

,

D

z

}

max

{

E

x

,

E

y

,

E

z

}

}

\min\left\{\begin{matrix} \max\{A_x,A_y,A_z\}\\ \max\{B_x,B_y,B_z\}\\ \max\{C_x,C_y,C_z\}\\ \max\{D_x,D_y,D_z\}\\ \max\{E_x,E_y,E_z\} \end{matrix}\right\}

min⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧​max{Ax​,Ay​,Az​}max{Bx​,By​,Bz​}max{Cx​,Cy​,Cz​}max{Dx​,Dy​,Dz​}max{Ex​,Ey​,Ez​}​⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫​

力量Strength最大的方案的力量Strength是多少。

输入分别给出

N

N

N 和

N

N

N 行整数

A

i

,

B

i

,

C

i

,

D

i

,

E

i

A_i,B_i,C_i,D_i,E_i

Ai​,Bi​,Ci​,Di​,Ei​。

输出一行一个整数表示答案。

3

N

3000

,

1

A

i

,

B

i

,

C

i

,

D

i

,

E

i

1

0

9

3\leq N\leq 3000,1\leq A_i,B_i,C_i,D_i,E_i \leq 10^9

3≤N≤3000,1≤Ai​,Bi​,Ci​,Di​,Ei​≤109.

Sample Input

10
6 7 5 18 2
3 8 1 6 3
7 2 8 7 7
6 3 3 4 7
12 8 9 15 9
9 8 6 1 10
12 9 7 8 2
10 3 17 4 10
3 1 3 19 3
3 14 7 13 1

Sample output

10

题解

首先,我们会想到一种

N

3

N^3

N3 的暴力做法。

之所以这样过不了,是因为我们想知道的力量与每个属性都有关,又跟每个属性的最大值有关,属性不同的有

N

N

N 个人,因此时间复杂度便上天。

为了消除这些限制,同时发现这道题相当于求最小值前提下的最大值,于是我们不妨想想二分

我们二分一个答案,表示每项属性的最大值都要大于等于这个值。那么此时,相当于定了一个标准——一个属性大于等于这个值为合格,否则不合格。要求是要让选出的三个人中每项属性都至少有一个人合格。此时,由于我们想知道的是否合法每个属性的合格与否有关,而每个属性只有两种情况:合格/不合格,因此,把每项属性合格情况(一共

2

5

2^5

25 种)相同的合并到一起,我们相当于只有

2

5

=

32

2^5=32

25=32 位候选人了!然后再随便用一个三次方的暴力(时间

2

15

2^{15}

215)就可以解决问题,或者稍加dp优化变成平方,跑到最优解 6~8 ms。

时间复杂度

O

(

log

X

(

5

N

+

2

10

)

)

O(\log X(5N+2^{10}))

O(logX(5N+210))

CODE

#include<map>
#include<queue>
#include<cmath>
#include<vector>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MAXN 3005
#define ENDL putchar('\n')
#define LL long long
#define DB double
#define lowbit(x) ((-x) & (x))
LL read() {
LL f = 1,x = 0;char s = getchar();
while(s < '0' || s > '9') {if(s=='-')f = -f;s = getchar();}
while(s >= '0' && s <= '9') {x=x*10+(s-'0');s = getchar();}
return f * x;
}
int n,m,i,j,s,o,k;
int a[MAXN][10];
bool dp[4][1<<5|5];
bool check(int val) {
memset(dp,0,sizeof(dp));
for(int i = 1;i <= n;i ++) {
int S = 0;
for(int j = 1;j <= 5;j ++) {
if(a[i][j] >= val) S |= (1<<(j-1));
}
dp[1][S] = 1;
}
dp[1][0] = dp[2][0] = dp[3][0] = 1;
for(int kk = 1;kk <= 2;kk ++) {
for(int i = 0;i < (1<<5);i ++) {
if(dp[kk][i])
for(int j = 0;j < (1<<5);j ++) {
dp[kk+1][i|j] |= dp[1][j];
}
}
}
return dp[3][(1<<5)-1];
}
int main() {
n = read();
for(int i = 1;i <= n;i ++) {
for(int j = 1;j <= 5;j ++) {
a[i][j] = read();
}
}
int ans = 0;
for(int i = 30;i >= 0;i --) {
if(ans+(1<<i) <= 1000000000 && check(ans+(1<<i))) ans += (1<<i);
}
printf("%d\n",ans);
return 0;
}

别的做法

暴力

有一个

15

N

2

15*N^2

15∗N2 的做法,详见PPL的博客
其核心思想在于:最后的方案中,不可能三个人都贡献了

2

\geq2

≥2 个最大值,因此一定有一个人贡献了

1

\leq 1

≤1 个最大值,那么不妨就令这个人为这个属性中可以选的最大的一个人,于是暴力可以少一维。

Dynamic Programming

官方题解中的第二种做法。

题意可以转化为:你先选三个候选人

x

,

y

,

z

x,y,z

x,y,z,然后每个属性你都在三个人中选一个人的拿出来,要让这五个数的最小值最大。不难发现这样和原题面(贪心地选最大的)最终答案是一样的。

那么就可以设计出一个 DP:

d

p

[

i

]

[

j

]

[

k

]

dp[i][j][k]

dp[i][j][k] 表示前

i

i

i 个人中选了

j

j

j 个人(

j

3

j\leq3

j≤3) ,属性状态为

k

k

k(

k

2

5

k\leq 2^5

k≤25) 时的最大答案(

k

k

k 的二进制第

i

i

i 位表示第

i

i

i 种属性是否已经选了人),转移的时候保证每种属性只选一个人。转移可以

O

(

5

)

O(5)

O(5) 。

那么总时间就是

O

(

15

N

2

5

)

O(15N*2^5)

O(15N∗25)。

官方代码

Atcoder ZONe Energy Programming Contest C - MAD TEAM(二分)的更多相关文章

  1. AtCoder SoundHound Inc. Programming Contest 2018 E + Graph (soundhound2018_summer_qual_e)

    原文链接https://www.cnblogs.com/zhouzhendong/p/AtCoder-SoundHound-Inc-Programming-Contest-2018-E.html 题目 ...

  2. AtCoder diverta 2019 Programming Contest 2

    AtCoder diverta 2019 Programming Contest 2 看起来我也不知道是一个啥比赛. 然后就写写题解QWQ. A - Ball Distribution 有\(n\)个 ...

  3. 【AtCoder】M-SOLUTIONS Programming Contest

    M-SOLUTIONS Programming Contest A - Sum of Interior Angles #include <bits/stdc++.h> #define fi ...

  4. 【AtCoder】AISing Programming Contest 2019

    本来以为是1199rated的..仔细一看发现是1999,所以就做了一下 这场涨分很轻松啊...为啥又没打 等pkuwc考完我一定打一场atcoder(咕咕咕,咕咕咕,咕咕咕咕咕咕咕~) 但是其实我思 ...

  5. 【AtCoder】Yahoo Programming Contest 2019

    A - Anti-Adjacency K <= (N + 1) / 2 #include <bits/stdc++.h> #define fi first #define se se ...

  6. 【AtCoder】KEYENCE Programming Contest 2019

    A - Beginning 这个年份恐怕需要+2 #include <bits/stdc++.h> #define fi first #define se second #define p ...

  7. 【AtCoder】Dwango Programming Contest V题解

    A - Thumbnail 题意简述:给出N个数,找出N个数中和这N个数平均值绝对值最小的数 根据题意写代码即可= = #include <bits/stdc++.h> #define f ...

  8. zoj The 12th Zhejiang Provincial Collegiate Programming Contest Team Formation

    http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=5494 The 12th Zhejiang Provincial ...

  9. Codeforces Gym101572 B.Best Relay Team (2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017))

    2017-2018 ACM-ICPC Nordic Collegiate Programming Contest (NCPC 2017) 今日份的训练,题目难度4颗星,心态被打崩了,会的算法太少了,知 ...

随机推荐

  1. Java泛型知识总结

    泛型 前言 在没有泛型之前,程序员必须使用Object编写适用于多种类型的代码.很繁琐,也不安全. 泛型的引入使Java有了一个很强的类型系统,允许设计者详细地描述变量和方法的类型要如何变化. 在普通 ...

  2. centos 修改PHP默认版本

    命令行输入export PATH=/usr/local/php/bin:$PATH 然后回车.

  3. 7.脚本三剑客之awk

    脚本三剑客之awk 目录 脚本三剑客之awk awk介绍 awk工作原理 awk命令格式 awk基础用法 awk命令高级用法 date命令使用 awk介绍 AWK 是一种处理文本文件的语言,是一个强大 ...

  4. 揭秘GaussDB(for Redis):全面对比Codis

    摘要:Codis集群在国内Redis生态圈很流行,社区已停止维护.本文从架构和特性两方面对比,带你感受华为云GaussDB(for Redis)的全新价值. 本文分享自华为云社区<华为云Gaus ...

  5. Linux 文件权限相关知识

    文件权限说明 Linux中的文件能否被访问和工具(程序)无关,和访问的用户身份有关(谁去运行这个程序) 进程的发起者(谁去运行这个程序). 进程的发起者若是文件的所有者: 拥有文件的属主权限 进程的发 ...

  6. map集合中对应key的value为null处理办法

    问题: Map集合中对应key的value为null,但是现在需要将这个value转为Integer类型,这个value如果不是null,那么get到的是long类型或者是Bigdecimal类型 处 ...

  7. Ansible Playbook概览

    Ansible playbook 执行需要三步路执行: 1.编写playbook 2.定义主机清单文件 3.设置运行环境,写入配置文件 1.编写playbook Playbook使用YAML语法格式进 ...

  8. springboot creating bean with name 'sqlSessionFactory'

    pom.xml文件配置 <build> <plugins> <plugin> <groupId>org.springframework.boot< ...

  9. 减省 Java 小半内存,Solon v1.9.2 发布

    相对于 Spring Boot 和 Spring Cloud 的项目: 启动快 5 - 10 倍. (更快) qps 高 2- 3 倍. (更高) 运行时内存节省 1/3 ~ 1/2. (更少) 打包 ...

  10. 这样优化Spring Boot,启动速度快到飞起!

    微服务用到一时爽,没用好就呵呵啦,特别是对于服务拆分没有把控好业务边界.拆分粒度过大等问题,某些 Spring Boot 启动速度太慢了,可能你也会有这种体验,这里将探索一下关于 Spring Boo ...