CSU 1364 Interview RMQ
题意:
瑶瑶有一家有一家公司,最近他想招m个人。因为他的公司是如此的出名,所以有n个人来参加面试。然而,瑶瑶是如此忙,以至于没有时间来亲自面试他们。所以他准备选择m场面试来测试他们。
瑶瑶决定这样来安排面试。首先,他把这些面试者按照来到的顺序排成一队。然后,他把这个队列切成m段。每段的长度是[n/m](向下取整),这意味着他将忽略掉剩下的人。然后,他将选择每一段里面最好的那个人。
瑶瑶的想法看起来很有趣,但是他遇到了另外的问题。他把每个人的能力赋了一个值。值越大的越好。他希望员工足够的好,这样,他们的和可以达到他的目标k(严格大于)。另一方面,因为现在高昂的工资,他希望员工的数量尽可能少。
你能帮他找出最小的m吗?
思路:
Sparse Table + 枚举区间长度。
枚举区间个数会TLE,不懂为什么,代码也有点没看懂。
代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <cmath> using namespace std; const int MAXN = (int)2e5+; int ST[][MAXN]; //Sparse Table
int hight[MAXN];
int n, k; inline int topBit(int x) {
return (int) (log((double)x)/log(2.0));
} inline int Query(int L, int R) {
int h = hight[R-L];
if ((R-L) < (<<h)) h -= ;
return max(ST[h][L], ST[h][R-(<<h)]);
} int main() {
#ifdef Phantom01
freopen("CSU1364.in", "r", stdin);
#endif // Phantom01 memset(hight, , sizeof(hight));
for (int i = ; i < MAXN; i++) //比他左位移一位的数高一
hight[i] = hight[i>>] + ; while (scanf("%d %d", &n, &k)!=EOF) {
if (-==n && -==k) break; for (int i = ; i < n; i++)
scanf("%d", &ST[][i]); //最下面一层就是原始数据 int h = hight[n];
for (int i = ; i <= h; i++) {
for (int j = ; j < n; j++) {
if ((j+(<<(i-))) < n)
ST[i][j] = max(ST[i-][j], ST[i-][j+(<<(i-))]);
else
ST[i][j] = ST[i-][j];
}
}
int ans = -;
for (int i = n; i > ; i--) {
int m = n/i;
int tmp = ;
for (int j = ; j < m; j++) {
tmp += Query(j*i, (j+)*i);
if (tmp>k) {
ans = j+; //不知道这里为啥是j+1而不是 m
break;
}
}
if (tmp > k)
break;
}
printf("%d\n", ans);
} return ;
}
-------------------------
PS: 后来看到一个代码,直接二分答案即可,复杂度也是n*log(n)的,但是编程复杂度没这么大。
#include <cstdio> int a[], n; bool Can(int m, int k)
{
int i, j, t, sum, MAX;
t = n / m;
for (i = j = sum= ; i < m; i++)
{
MAX = -;
for (j = ; j < t; j++)
if (MAX < a[i*t+j]) MAX = a[i*t+j];
sum += MAX;
if (sum > k) return true;
}
return sum > k;
} int main()
{
int k, m, up, down, i, sum;
//freopen("in", "r", stdin);
while (scanf("%d%d", &n, &k), n >= && k >= )
{
for (i = sum = ; i < n; i++)
{
scanf("%d", a + i);
sum += a[i];
}
if (sum <= k) puts("-1");
else {
down = ; up = n;
while (down < up)
{
m = (up + down) / ;
if (Can(m, k)) up = m;
else down = m + ;
}
printf("%d\n", up);
}
}
return ;
}
CSU 1364 Interview RMQ的更多相关文章
- CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...
- CSU 1553 Good subsequence(RMQ问题 + 二分)
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n nu ...
- csu 1553(RMQ+尺取法)
1553: Good subsequence Time Limit: 2 Sec Memory Limit: 256 MBSubmit: 794 Solved: 287[Submit][Statu ...
- *HDU3486 RMQ+二分
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- hdu 3486 Interviewe (RMQ+二分)
Interviewe Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total ...
- CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列 ...
- CSU1553 Good subsequence —— 二分 + RMQ/线段树
题目链接: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n n ...
- 3486 ( Interviewe )RMQ
Problem Description YaoYao has a company and he wants to employ m people recently. Since his company ...
- Pramp mock interview (4th practice): Matrix Spiral Print
March 16, 2016 Problem statement:Given a 2D array (matrix) named M, print all items of M in a spiral ...
随机推荐
- yaml文件结构
VERSION: 1.0.0.1 --指定控制文件schema的版本DATABASE: db_name --指定连接数据库的名字,如果没有指定,由环境变量$P ...
- hadoop 编译自己的jar包并运行
我修从网上找了份java代码 我为了让它在hadoop下跑起来居然花了两个多小时... 首先最好不要在java代码中设置package...使用default package即可... 然后在java ...
- python学习笔记第三章
1.列表是由一系列特定顺序排列得元素组成,在python中用([])组成,列表得索引是从0开始,不是1 xu=['a','b',''c] print(xu) 访问列表的元素第一个元素 xu=['a', ...
- python3 之 Ellipsis
在翻django 代码的时候无意中看到的, 主要还是在注解时候使用 官方参考:https://docs.python.org/3/library/constants.html#Ellipsis 注意: ...
- NOIp模拟赛三十一
持续降智 分数:100+0+0=100 C题subtask是假的,根本没有部分分中的情况...还我20分QAQ A:[BZOJ4444]国旗计划 B:[agc006f]blackout C:[arc0 ...
- [BZOJ3673&3674]可持久化并查集&加强版
题目大意:让你实现一个可持久化的并查集(3674强制在线). 解题思路:刚刚介绍了一个叫rope的神器:我是刘邦,在这两题(实际上两题没什么区别)就派上用场了. 正解应该是主席树||可持久化平衡树,然 ...
- C++容器(四):map类型
map 类型 map是键-值对的集合.map类型通常可以理解为关联数组:可以使用键作为下标来获取一个值,正如内置数组类型一样.而关联的本质在于元素的值与某个特定的键相关联,而非通过元素在数组内的位置来 ...
- [Angular] Configure an Angular App at Compile Time with the Angular CLI
Compile time configuration options allow you to provide different kind of settings based on the envi ...
- JNI 资源释放
JNI 编程实现了 native code 和 Java 程序的交互,因此 JNI 代码编程既遵循 native code 编程语言的编程规则,同时也遵守 JNI 编程的文档规范.在内存管理方面,na ...
- m_Orchestrate learning system---二十六、动态给封装好的控件添加属性
m_Orchestrate learning system---二十六.动态给封装好的控件添加属性 一.总结 一句话总结:比如我现在封装好了ueditor控件,我外部调用这个控件,因为要写数据到数据库 ...