题意:

  瑶瑶有一家有一家公司,最近他想招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. POJ 1979 Red and Black (简单dfs)

    题目: 简单dfs,没什么好说的 代码: #include <iostream> using namespace std; typedef long long ll; #define IN ...

  2. php——get与post方法(转)

    file_get_contents版本: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 <?php /**  * 发送p ...

  3. 路飞学城Python-Day9

    [23.函数-高阶函数]变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称为高阶函数如果一个函数可以接收另一个函数,这个函数就称为高阶函数 def func ...

  4. 使用windowbuilder的时候更方便——设置默认把控件生成为成员变量而不是局部变量

    找了一大圈,最后还是上Google才找到这个方法的.以前改过了,重新设置工作目录之后设置都丢失了,却找不到改的办法,这次长个记性,记在自己博客里. 设置成成员属性的好处是随后使用这些控件的时候方便.

  5. 操作Map

    ///操作Map Map<String,Object> userInfo = new HashMap(); userInfo.put("uid", adUserEnti ...

  6. (WC2018模拟十二)【FJOI2016集训Day7T3】Xor-Mul棋盘

    是不是应该第100篇博文纪念一下? 题解: 本质简单题...但是我没仔细看这题... 观察它的两个式子,都是xor完再乘以某个数,意味着d数组的每个二进制位对答案的贡献都是独立的,可以每一位分开处理. ...

  7. AC自动机笔记

    AC自动机 #include<iostream> #include<cstring> #include<cstdio> #include<cmath> ...

  8. 题解 P3834 【【模板】可持久化线段树 1(主席树)】

    可持久化线段树的前置知识是权值线段树,但是你不学也没有太大的关系因为思想不是很难理解. 可持久化线段树支持历史记录查询,这是它赖以解题的方法. 在本题中思路是建立n颗线段树,然后对于每次询问,考虑其中 ...

  9. android将String转化为MD5的方法+一些String经常使用的方法

    public class StringUtils { public static String MD5Encode(String origin) { String resultString = nul ...

  10. C语言之文件操作04——输入矩阵a,b,求乘积c,并打印a,b,c到文件

    //文件与数组结合 /* ================================================================= 题目:输入矩阵a,b,求乘积c,并打印a, ...