UVa 714 - Copying Books
2012-08-02 11:04
274 查看
“最大值最小化”问题,先二分求最大值,再贪心实现按最左边区间最小的格式输出 。
代码如下:
代码如下:
#include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int main() { #ifdef test freopen("in.txt", "r", stdin); #endif int a[505], b[505]; int k, m, num; scanf("%d", &num); while(num--) { long long left = 0, right = 0, ct, to, mid; memset(b, 0, sizeof(b)); scanf("%d%d", &m, &k); for(int i = 0; i < m; i++) { scanf("%d", &a[i]); right += a[i]; } while(left < right) // 二分求最大值 { ct = 0, to = 0; mid = (left + right) / 2; for(int i = 0; i < m; i++) { to += a[i]; if(a[i] > mid) // 当单个元素大于中值时,需增大mid的值 { ct = k; // 使其跳出 break; } if(to >= mid) { if(ct >= k) break; ct++; to = a[i]; } } if(ct > k - 1) left = mid + 1; else right = mid; } for(int cct = 0, tot =0, i = m - 1; i >= 0; i--) // 贪心 { tot += a[i]; if(a[i] > mid) //二分求最大值时可能有一点小误差,当单个元素略大于最大值时,用此更新最大值 mid = a[i]; if(cct < k - 1 && (tot > mid || i < (k - 1) - cct)) // 区间值大于最大值或是所剩元素与所剩区间数相等时都需划分 { b[i] = 1; tot = a[i]; ++cct; } } for(int i = 0; i < m; i++) { printf("%d%c", a[i], i != m-1 ? ' ' : '\n'); if(b[i]) printf("/ "); } } return 0; }
相关文章推荐
- UVA 714 Copying Books
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- Copying Books UVA - 714
- 抄书(Copying Books, UVa 714)
- UVa 714 - Copying Books 二分答案
- UVA714:Copying Books(抄书)
- UVA714- Copying Books(最大值最小化)
- uva 714 - Copying Books(贪心 最大值最小化 二分)
- UVA_714_Copying Books
- 【NOIP提高组2015D2T1】uva 714 copying books【二分答案】——yhx
- UVA ~ 714 ~ Copying Books(二分+最大值最小化)
- UVa 714 Copying Books(二分)
- UVA 714 Copying Books
- UVA 714 Copying Books
- Uva714 Copying Books 【二分】【例题8-10】
- Uva - 714 - Copying Books
- UVA-714 Copying Books
- Uva 714 - Copying Books
- uva 714 - Copying Books
- uva 714 Copying Books