1 条题解
-
0
30 分
暴力搜索划分方案即可。
60 分
写一个简单 dp 就行,设 表示划分到了 ,当前 是否可行,转移是简单的,时间复杂度 ,其中 是值域。 80 分 手玩可以发现答案一定是 。
正解
注意到一个关键性质:。 证明是容易的,设 ,那么 ,于是 肯定成立。 这个性质说明最优划分一定只会划分为两段,否则将相邻的两段合并起来一定更优。 于是滚一个前缀和,暴力枚举分割点即可,时间复杂度 。
#include<bits/stdc++.h> using namespace std; #define ll long long const int N = 1e5+5; ll ans, a[200010]; int n; void solve() { scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%lld", &a[i]); a[i] += a[i - 1]; } for (int i = 1; i <= n - 1; i++) { ans = max(ans, __gcd(a[i], a[n] - a[i])); } printf("%lld\n", ans); } int main() { freopen("partition.in", "r", stdin); freopen("partition.out", "w", stdout); int _ = 1; while (_--) solve(); return 0; }
- 1
信息
- ID
- 178
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 3
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者