Uva1451 数形结合
来源:互联网 发布:淘宝如何清空收藏夹 编辑:程序博客网 时间:2024/05/23 14:16
#include<cstdio>
using namespace std;
const int maxn = 100000 + 5;
int n, L;
char s[maxn];
int sum[maxn], p[maxn];//p存储的是节点,sum存储前缀和。
int compare_average(int x1, int x2, int x3, int x4) {//比较两段的斜率哪个更大,将除法转换成了乘法
return (sum[x2]-sum[x1-1]) * (x4-x3+1) - (sum[x4]-sum[x3-1]) * (x2-x1+1);
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d%s", &n, &L, s+1);
sum[0] = 0;
for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + s[i] - '0';
int ansL = 1, ansR = L;//结果初始化
int i = 0, j = 0;//i从作开始保留最优解,j从右往左进行剪枝。
for (int t = L; t <= n; t++) {//结束的节点
while (j-i > 1 && compare_average(p[j-2], t-L, p[j-1], t-L) >= 0) j--;//当左节点比右节点大,进行剪枝
p[j++] = t-L+1; //向右继续遍历
while (j-i > 1 && compare_average(p[i], t, p[i+1], t) <= 0) i++; // 由j-i > 1,j-2 j-2 i i+1 保证了可以不越界并且充分剪枝
int c = compare_average(p[i], t, ansL, ansR);
if (c > 0 || c == 0 && t - p[i] < ansR - ansL) {//更新最优解
ansL = p[i]; ansR = t;
}
}
printf("%d %d\n", ansL, ansR);
}
return 0;
}
using namespace std;
const int maxn = 100000 + 5;
int n, L;
char s[maxn];
int sum[maxn], p[maxn];//p存储的是节点,sum存储前缀和。
int compare_average(int x1, int x2, int x3, int x4) {//比较两段的斜率哪个更大,将除法转换成了乘法
return (sum[x2]-sum[x1-1]) * (x4-x3+1) - (sum[x4]-sum[x3-1]) * (x2-x1+1);
}
int main() {
int T;
scanf("%d", &T);
while(T--) {
scanf("%d%d%s", &n, &L, s+1);
sum[0] = 0;
for(int i = 1; i <= n; i++) sum[i] = sum[i-1] + s[i] - '0';
int ansL = 1, ansR = L;//结果初始化
int i = 0, j = 0;//i从作开始保留最优解,j从右往左进行剪枝。
for (int t = L; t <= n; t++) {//结束的节点
while (j-i > 1 && compare_average(p[j-2], t-L, p[j-1], t-L) >= 0) j--;//当左节点比右节点大,进行剪枝
p[j++] = t-L+1; //向右继续遍历
while (j-i > 1 && compare_average(p[i], t, p[i+1], t) <= 0) i++; // 由j-i > 1,j-2 j-2 i i+1 保证了可以不越界并且充分剪枝
int c = compare_average(p[i], t, ansL, ansR);
if (c > 0 || c == 0 && t - p[i] < ansR - ansL) {//更新最优解
ansL = p[i]; ansR = t;
}
}
printf("%d %d\n", ansL, ansR);
}
return 0;
}
0 0
- Uva1451 数形结合
- UVa1451 数形结合
- uva1451 平均值 数形结合
- 数形结合、单调队列+uva1451
- uva1451 - Average(数形结合)
- UVa1451 - Average
- 1451 - Average(数形结合)
- poj2018(斜率数形结合)
- uva 1451 - Average 数形结合
- Matlab数形结合求解不等式
- UVALive 4726 Average(数形结合)
- 1451 - Average(数形结合)
- uva 1451 - Average(数形结合)
- UVa 1451:Average(数形结合)
- LA4726(数形结合 & 单调队列)
- UVa 1451 平均值 数形结合
- LA 3716 DNA Regions 数形结合 -
- HDU-4790 Just Random (数形结合)
- 使用数据结构,最大上升子串问题
- 剑指Offer 24题 二叉搜索树的后序遍历序列 Java
- 拒绝从入门到放弃_《鸟哥的 Linux 私房菜 — 基础学习篇(第三版)》必读目录
- Python.You-Get -- Python的视频下载工具[推荐玩玩]
- notepad++ key words 设置
- Uva1451 数形结合
- solve 方法总结
- DIV与前面的控件在同一行显示.
- 手把手教你如何安装和使用Karma-Jasmine
- 剑指Offer 25题 二叉树中和为某一值的路径 Java
- C++获取当前路径
- 常用的项目管理工具JIRA | ...
- Leetcode 341. Flatten Nested List Iterator
- Python.微信