Codeforces 803D - Magazine Ad(二分)

xiaoxiao2021-02-27  522

题目链接

http://codeforces.com/contest/803/problem/D

题意

字符串分成最大k行,使最大的那一行长度尽量小。 划分要求:空格或者-

思路

二分 二分一下每行最大多长,然后判断即可。

代码

#include <bits/stdc++.h> using namespace std; inline int in() {int x; scanf("%d", &x); return x;} #define pr(x) {cout << #x << ' ' << x << endl;} const int maxn = 1e6 + 5; vector<int> v; int k, n; char a[maxn]; bool judge(int len) { if (v.empty()) return n <= len ? 1 : 0; int cnt = 0, tot = 1; for (int i = 0; i < v.size(); i++) { int x = v[i]; if (x > len) return false; if (cnt + x <= len) { cnt += x; } else { ++tot; cnt = x; } } return tot <= k; } int main() { k = in(); getchar(); cin.getline(a, maxn - 1); n = strlen(a); vector<int> tmp; for (int i = 0; i < n; i++) { if (a[i] == ' ' || a[i] == '-') tmp.push_back(i); } for (int i = 0; i < tmp.size(); i++) { v.push_back(tmp[i] - (i ? tmp[i - 1] : -1)); } if (tmp.size()) v.push_back(n - tmp.back() - 1); int l = 0, r = n, m, ans = n; while (l <= r) { m = l + (r - l >> 1); if (judge(m)) r = m - 1, ans = m; else l = m + 1; } cout << ans << endl; return 0; }
转载请注明原文地址: https://www.6miu.com/read-606.html

最新回复(0)