Uva - 714 - Copying Books
2015-06-21 22:25
357 查看
把问题转换为把输入序列划分成m个连续的子序列,s.t 所有的S(i)均不超过x。然后二分最小值。
AC代码:
#include <iostream> #include <cstdio> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <sstream> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <bitset> #include <cassert> #include <cmath> using namespace std; const int maxm = 505; int k, m; int p[maxm]; // 在maxp的限制下最多需要多少scribers int solve(long long maxp) { long long done = 0; int ans = 1; for (int i = 0; i < m; i++) { if (done + p[i] <= maxp) { done += p[i]; } else { ans++; done = p[i]; } } return ans; } int last[maxm]; // 贪心输出结果 void print(long long ans) { long long done = 0; memset(last, 0, sizeof(last)); int remain = k; for (int i = m - 1; i >= 0; i--) { if (done + p[i] > ans || i + 1 < remain) { last[i] = 1; remain--; done = p[i]; } else { done += p[i]; } } for (int i = 0; i < m - 1; i++) { cout << p[i] << " "; if (last[i]) { cout << "/ "; } } cout << p[m - 1] << endl; } int main() { ios::sync_with_stdio(false); int n; cin >> n; while (n--) { cin >> m >> k; long long tot = 0; // 总和 int maxp = -1; // 最大值 for (int i = 0; i < m; i++) { cin >> p[i]; tot += p[i]; maxp = max(maxp, p[i]); } long long L = maxp, R = tot; // 二分最小值 while (L < R) { long long M = L + (R - L) / 2; if (solve(M) <= k) { R = M; } else { L = M + 1; } } print(L); } return 0; }
相关文章推荐
- Uva - 714 - Copying Books
- 用PowerShell隐藏磁盘驱动器
- ArchLinux - 安装指南
- qt移植到OK6410开发板linux系统过程
- Java 反编译利器 JD-GUI/Jad/JadClipse(支持windows/linux/mac)
- hadoop 2.5.2 完全分布式集群环境搭建 (1)
- CentOS 7安装配置Samba服务器
- 实战部署weblogic集群及发布应用(4)
- 如何进行nginx或tomcat的性能调优(优秀推荐)
- Zabbix的集中式监控
- linux命令行中命令
- nginx或tomcat的性能优化调整详解
- 软负载与nginx那些强大的不可不说的功能
- [SHELL]20150621前总结——基本常用操作语句
- 利用霍夫变换检测图像中存在的圆与直线
- Hadoop
- (总结)Nginx配置文件nginx.conf中文详解
- ubuntu 平台hadoop2.6.0 按装hive 及注意事项
- Linux kernel 的 sendfile 是如何提高性能的
- Nginx Rewrite规则初探