UVA
来源:互联网 发布:淘宝代充平台 编辑:程序博客网 时间:2024/05/22 17:57
题目链接:UVA 714
#include<cstring>#include<string>#include<iostream> using namespace std;const int maxn = 10000000 + 5;int n, m;long long _max,left,right,_min;int a[maxn];int ans[510];bool judge(long long mid) //判断能否每组都小于等于mid{ long long sum = 0; int t = 1; for (int i = n - 1; i >= 0; i--) { if (sum + a[i] > mid) { sum = a[i]; t++; if (t > m) return false; //需要分的组数大于了给定的m组,返回false } else sum += a[i]; } return true;}void solve(){ memset(ans, 0, sizeof(ans)); ::left = _min, ::right = _max; while (::left <= ::right) { long long mid = (::left + ::right) / 2; if (judge(mid)) { ::right = mid - 1; } else ::left = mid + 1; } long long sum = 0; int count = 1; for (int i = n - 1; i >= 0; i--) { if (sum + a[i] > ::left) { sum = a[i]; ans[i] = 1; count++; } else sum += a[i]; if (m - count == i + 1) //如果剩下来的值数量正好等于要划分的组数,那么一个数为一组 { for (int j = 0; j <= i; j++) ans[j] = 1; break; } } for (int i = 0; i < n - 1; i++) { cout << a[i] << " "; if (ans[i]) cout << "/ "; } cout << a[n - 1] << endl;}int main(){ //freopen("D:\\txt.txt", "r", stdin); int t; cin >> t; while (t--) { cin >> n >> m; _min = 0; _max = 0; for (int i = 0; i < n; i++) { cin >> a[i]; if (_min < a[i]) _min = a[i]; _max += a[i]; } solve(); } return 0;}
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- SOJ 1035
- 沉浸式状态栏框架-SystemBarTint
- git常用命令以及使用技巧
- html5与安卓native交互,相互调用
- 【算法】牛客网模拟题编程部分3.23日
- UVA
- JAVA多线程之——线程的实现方式
- ZSTUOJ 4270: 同源数
- 在mac系统安装Apache Tomcat的详细步骤
- [leetcode]83. Remove Duplicates from Sorted List
- Jsp中标签使用:tag 文件方式 和 tld文件方式
- javaScript采用面向对象的方式实现实现拖拽
- jq-$.extend方法使用说明
- JAD-CACHE缓存框架1.0.2版本发布