soj 2978 Tasks
2015-11-04 14:25
330 查看
@(K ACMer)
题意
数组a全部为0,给你一个和数组a同样大小的数组b,你可以选择把任意一个a[i]变成b[i].但是保证必须保证a中所有元素的和小于t.
定义f(a)为a数组中最长的连续0的个数,求f(a)的最小值.
分析:
看起来这个题,要直接求出来最优结果似乎是不可能的,最暴力的枚举是2的指数次的显然不可行.
我们可以二分的来枚举这个最长区间的长度k.然后去判断这个长度是否可以满足要求.
那么如何去判断呢?
想了一下,贪心的去对每个长度为k的区间选取最小值是不对的..
其实这里是一个经典的dp,定义dp[i]为选第i个最大连续0长度小于mid最少需要选的数.那么dp[i]肯定由其前面的mid个dp[j]中最小的那个转移而来,这样只需要判断最后的dp
的值是否小于等于t就可以了.
这里dp的复杂度是O(n2)的,注意到其中用的了固定长度连续区间的最小值来转移,这里我们用单调队列来维护这个最小值即可,让dp复杂度降为O(n).
code
题意
数组a全部为0,给你一个和数组a同样大小的数组b,你可以选择把任意一个a[i]变成b[i].但是保证必须保证a中所有元素的和小于t.
定义f(a)为a数组中最长的连续0的个数,求f(a)的最小值.
分析:
看起来这个题,要直接求出来最优结果似乎是不可能的,最暴力的枚举是2的指数次的显然不可行.
我们可以二分的来枚举这个最长区间的长度k.然后去判断这个长度是否可以满足要求.
那么如何去判断呢?
想了一下,贪心的去对每个长度为k的区间选取最小值是不对的..
其实这里是一个经典的dp,定义dp[i]为选第i个最大连续0长度小于mid最少需要选的数.那么dp[i]肯定由其前面的mid个dp[j]中最小的那个转移而来,这样只需要判断最后的dp
的值是否小于等于t就可以了.
这里dp的复杂度是O(n2)的,注意到其中用的了固定长度连续区间的最小值来转移,这里我们用单调队列来维护这个最小值即可,让dp复杂度降为O(n).
code
#include <iostream> #include <cstdio> #include <cstring> #include <set> #include <map> #include <stack> #include <vector> #include <string> #include <queue> #include <cstdlib> #include <cmath> #include <algorithm> using namespace std; const int mod = int(1e9) + 7, INF = 0x3fffffff, maxn = 1e5 + 40; int b[maxn], n, t, dp[maxn], que[maxn]; bool judge(int x) { int l = 0, r = 0; for (int i = 0; i <= n; i++) { int k = i <= x ? 0 : dp[que[l]]; dp[i] = k + b[i]; if (i - x > que[l]) l++; while (r != l && dp[i] < dp[que[r - 1]]) r--; que[r++] = i; } return dp <= t; } int main(void) { while (~scanf("%d%d", &n, &t)) { for (int i = 0; i < n; i++) scanf("%d", &b[i]); b = 0; int l = 0, r = n; while (r > l) { // cout << l << " " << r << endl; int mid = (r + l) / 2; if (judge(mid)) r = mid; else l = mid + 1; } printf("%d\n", l); } return 0; }
相关文章推荐
- jsp内置对象,及常用方法
- ActiveMQ学习总结(1)——ActiveMQ快速入门
- ActiveMQ学习总结(1)——ActiveMQ快速入门
- ActiveMQ学习总结(1)——ActiveMQ快速入门
- ActiveMQ学习总结(1)——ActiveMQ快速入门
- UVa 12704 - Little Masters
- performSelector: 和dispatch_time及dispatch_once
- 有趣的小故事
- libevent
- spring的ServletRequestAttributes创建request()得到空指针
- 【PLSQL】绑定变量,活跃SQL,软硬解析解析
- 关于sql server2008数据库的连接的几个问题及解决办法
- jquery选取除了div之后 含有类名为a的 标签
- HTTP请求头具体含意
- Popwindow 使用例子:
- 方便的类成员访问接口
- 如何在java Web项目中开发WebService接口
- UML学习笔记之构件图和部署图
- 学习嵌入式Linux-JZ2440-启动过程分析
- codeforces-414B-Mashmokh and ACM