传送门

C - Linear Approximation

题意:

\[\sum_{i=1}^nabs(A_i-(b+i))
\]

\(A_i,b\)给出。

思路:

将括号拆开,变为\(A_i-i-b\),所以将所有的\(A_i\)减去\(i\),然后就是一个经典问题了。

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 5; int n;
int a[N]; void run() {
for(int i = 1; i <= n; i++) cin >> a[i], a[i] -= i;
sort(a + 1, a + n + 1);
int p = a[(n + 1) / 2];
ll ans = 0;
for(int i = 1; i <= n; i++) {
ans += abs(p - a[i]);
}
cout << ans << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n) run();
return 0;
}

D - Equal Cut

题意:

给出一个序列\(a\),长度为\(n,n\leq 2\cdot 10^5\)。现在要切三刀将这个序列分为四段,问最终每段和的最大值减去最小值最小为多少。

思路:

  • 因为只会切三刀,可以考虑单独枚举一刀,然后考虑其它两刀;
  • 那么就考虑枚举中间的那一刀,然后想怎么处理两边的划分。
  • 设左边的两段和为\(L_1,L_2\),右边的两段和为\(R_1,R_2\),那么当\(L_1,L_2\)以及\(R_1,R_2\)的差都最小时,答案最优。
  • 简略证明如下:
  • 左端和为\(L\),右端和为\(R\),那么不妨\(L_1=\frac{L}{2}+t,L2=\frac{L}{2}-t,R_1=\frac{R}{2}+k,R_2=\frac{R}{2}-k\),显然\(MAX=max(L_1,R_1),MIN=min(L_2,R_2)\),那么让\(t,k\)尽量小肯定最优。

其实证明也可以分情况讨论,也就只有两种情况,只是在直觉方面不好感受。。。但这样来想更为自然= =所以矛盾啊QAQ

Code
#include <bits/stdc++.h>
#define MP make_pair
#define fi first
#define se second
#define sz(x) (int)(x).size()
//#define Local
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int N = 2e5 + 5; int n;
int a[N];
ll sum[N]; ll Get(int l, int r, int m) {
return abs(sum[r] - sum[m] - sum[m] + sum[l - 1]);
} void run() {
for(int i = 1; i <= n; i++) {
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
int j = 1, k = 3;
ll ans = 1e18;
for(int i = 2; i <= n - 1; i++) {
while(j < i - 1 && Get(1, i, j) > Get(1, i, j + 1)) ++j;
while(k < n - 1 && Get(i + 1, n, k) > Get(i + 1, n, k + 1)) ++k;
ll mx = max(sum[i] - sum[j], max(sum[j], max(sum[n] - sum[k], sum[k] - sum[i])));
ll mn = min(sum[i] - sum[j], min(sum[j], min(sum[n] - sum[k], sum[k] - sum[i])));
// cout << j << ' ' << i << ' ' << k << '\n';
ans = min(ans, mx - mn);
}
cout << ans << '\n';
} int main() {
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
cout << fixed << setprecision(20);
#ifdef Local
freopen("../input.in", "r", stdin);
freopen("../output.out", "w", stdout);
#endif
while(cin >> n) run();
return 0;
}

E - Or Plus Max

可以参见:传送门

转换的思路还是挺巧妙的。

F - Colorful Sequences

太菜了不会啊。。。

最新文章

  1. 【python】确保文件写入结束
  2. PythonNote01_HTML标签
  3. 【fortify】安全漏洞的分类
  4. 《利用Python进行数据分析》第123章学习笔记
  5. MYSQL 5.7 添加新用户
  6. android 入门-防微信拍摄视频 按钮事件处理
  7. C++文本的读取和写入
  8. [网络] 用 OpenVPN 实现站对站 VPN 服务
  9. .NET平台上的Memcached客户端介绍
  10. Windows服务弹出MessageBox对话框
  11. 得到Android系统语言设置
  12. Python3基础 list() 将一个字符串转换成列表
  13. oracle数据库热备中的备份和恢复及例子
  14. zkw模板
  15. 微信小程序布局
  16. Kali学习笔记10:端口扫描详解(下)
  17. Redux与它的中间件:redux-thunk,redux-actions,redux-promise,redux-saga
  18. select下拉框可以直接取list里的内容 不用非得转map (不得不承认我是个ZZ,这么简单的问题才反应过来,--^--)
  19. Docker容器学习与分享12
  20. linux常用命令:touch 命令

热门文章

  1. Java连接MySQL数据库及简单的增删查改操作
  2. C#构造方法(构造函数)
  3. SpringMVC框架之第二篇
  4. Mybatis的小技巧
  5. 前端面试题套路--终极版(Vue、JavaScript)
  6. iOS字符串处理_替换(去掉空格换行)、截取
  7. ElementUi中el-table分页效果
  8. mysql与oracle的语法对比
  9. C编程小结1
  10. Python导入运行的当前模块报错