题意:

  瑶瑶有一家有一家公司,最近他想招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的更多相关文章

  1. CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...

  2. CSU 1553 Good subsequence(RMQ问题 + 二分)

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n nu ...

  3. csu 1553(RMQ+尺取法)

    1553: Good subsequence Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: 794  Solved: 287[Submit][Statu ...

  4. *HDU3486 RMQ+二分

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  5. hdu 3486 Interviewe (RMQ+二分)

    Interviewe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total ...

  6. CSU - 1551 Longest Increasing Subsequence Again —— 线段树/树状数组 + 前缀和&后缀和

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1551 题意: 给出一段序列, 删除其中一段连续的子序列(或者不删), 使得剩下的序列 ...

  7. CSU1553 Good subsequence —— 二分 + RMQ/线段树

    题目链接: http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1553 Description Give you a sequence of n n ...

  8. 3486 ( Interviewe )RMQ

    Problem Description YaoYao has a company and he wants to employ m people recently. Since his company ...

  9. 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 ...

随机推荐

  1. SpringBoot(三) SpringBoot中的日志配置

    SLF4J Spring Boot在所有内部日志中使用Commons Logging,但是默认配置也提供了对常用日志的支持,如:Java Util Logging,Log4J, Log4J2和Logb ...

  2. R和中心度、中心势

    最近用R画论文里的弦图,恰好借的书里着重写了中心度等问题. 网上流行一套密歇根大学社交计算的教程.但是前两年看了好几遍总是搞不清,即便是记公式也是收效不大.不妨按照书上总结一下. 绝对法: 无向图点度 ...

  3. C#多播委托和事件的区别与关系

    事件是对委托的封装. 如果一个类里,你把一个委托声明为 public 了,那么外部就可以随意改变委托变量的值,包括清空委托变量等,这样的话就违背了面向对象思想的封装特性:但如果声明为 private ...

  4. tomcat更改日志路径

    共有2个地方需要更改. 1.   tomcat/conf/logging.properties 步骤1--查找:grep logs logging.properties 步骤2--替换:sed -i ...

  5. java爬虫的selenium基础使用

    实用博客  selenium java教程 具体项目运用 项目背景:从西安市人民政府网站上获取到县区新闻,从下图可以看出“区县热点”是需要在页面中进行点击的,这里页面使用的是javascript的函数 ...

  6. angular踩坑记录

    ng-repeat和ng-click同时使用的时候,注意不能直接在ng-click当中写代码,必须在当前$scope中绑定一个事件,转为调用该事件.否则会出现意想不到的情况.具体原因点击这里. 使用自 ...

  7. Hdu 2586 树链剖分求LCA

    Code: #include<cstdio> #include<cstring> #include<vector> #include<algorithm> ...

  8. layer弹窗

    layer.alert(content, options, yes) - 普通信息框 它的弹出似乎显得有些高调,一般用于对用户造成比较强烈的关注,类似系统alert,但却比alert更灵便.它的参数是 ...

  9. iOS开发——AFNetworking基于https的使用

    应公司项目需求,之前的项目使用的http,新项目要求使用https,这篇博客是在AFNetworking框架基于http的基础上修改而来. 1.在开始前,先要把 .crt 文件转成 .cer 文件,然 ...

  10. HDU-1358 Period 字符串问题 KMP算法 求最小循环节

    题目链接:https://cn.vjudge.net/problem/HDU-1358 题意 给一个字符串,对下标大于2的元素,问有几个最小循环节 思路 对每个元素求一下minloop,模一下就好 提 ...