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 ...
随机推荐
- iOS Device Types
ios 设备硬件名称对照表 https://support.hockeyapp.net/kb/client-integration-ios-mac-os-x-tvos/ios-device-types ...
- Linux部署之批量自动安装系统之DHCP篇
1. 安装:yum install dhcp 2. Ip配置信息 3. Dhcp配置文件如下 4. 配置完后检查语法是否错误 ...
- 3dsMax插件开发环境配置
Windows 7 X64.3dsmax 2014 64位.3dsmax 2014 sdk.visual studio 2010: 软件下载:http://www.xy3dsmax.com/xiaza ...
- 《剑指Offer》——试题1:赋值运算符函数
题目:如下类型为CMyString的声明,请为该类型添加赋值运算符函数. class CMyString { public: CMyString(char* pData = NULL); CMyS ...
- Java基础学习总结(7)——Object类
一.Object类介绍 Object类在JAVA里面是一个比较特殊的类,JAVA只支持单继承,子类只能从一个父类来继承,如果父类又是从另外一个父类继承过来,那他也只能有一个父类,父类再有父类,那也只能 ...
- Qt之QSS(语法高亮)
简述 语法高亮是文本编辑器用来显示文本的,特别是源代码,根据不同的类别来用不同的颜色和字体显示.这个功能有助于编写结构化的语言,例如:编程语言.标记语言,这些语言的语法错误显示是有区别的. 简述 详细 ...
- unity3D常见问题
总结自己在学习中遇到的问题. 记录问题,帮助他人,有什么不正确的地方欢迎指正 没有发生碰撞 两个物体(Plane和Cube)都加入了collider,当中一个加入了rigidbody,应该会产生碰撞, ...
- 微信开发出现 redirect-uri參数错误原因是设置回调页面域名不要加HTTP://
OAuth2.0 网页授权设置.回调页面域名不要加HTTP:// NND 微信的研发.你程序处理下非常麻烦吗?给个提示非常麻烦吗?让我查了1个多小时.
- 多线程02---pThread简单介绍
1.简单介绍 pthread 是属于 POSIX 多线程开发框架. 它是c语言提供的一个跨平台的多线程解决方式.因为其在iOS编程中,操作比較麻烦.一般不用,这里介绍只作为了解. 2.pthread的 ...
- Linux 文件描写叙述符设置为非堵塞的方法
通过fcntl设置文件描写叙述符属性 fcntl即F_SETFL,F_GETFL的使用,设置文件的flags,堵塞设置成非堵塞,非堵塞设置成堵塞(这连个在server开发中能够封装为基本函数) 1.获 ...