LA3716 (单调队列)
2016-03-29 23:31
309 查看
题目大意:
有两个长度是n的序列,找出一个[l,r]的区间,这个区间内有不超过%p的数满足A[i] != B[i],问区间长度最长是多少。
思路:
计算出从开头到当前位置i有多少个不同的字母。
(i - j) * p >= (sum[i] - sum[j]) * 100
所以 sum[j]* 100 - j * p >= sum[i] * 100 - i *p因此我们要从大到小的顺序进行排序才可以满足题目的要求
代码:
有两个长度是n的序列,找出一个[l,r]的区间,这个区间内有不超过%p的数满足A[i] != B[i],问区间长度最长是多少。
思路:
计算出从开头到当前位置i有多少个不同的字母。
(i - j) * p >= (sum[i] - sum[j]) * 100
所以 sum[j]* 100 - j * p >= sum[i] * 100 - i *p因此我们要从大到小的顺序进行排序才可以满足题目的要求
代码:
#include <iostream> using namespace std; #include <stdio.h> #include <algorithm> const int N = 150005; struct node { int fa,len; }c ; char a ,b ; bool cmp(node x,node y) { if(x.fa != y.fa) return x.fa > y.fa; return x.len < y.len; } int n,p; int main() { while(scanf("%d %d",&n,&p) && n) { scanf("%s,%s",a + 1, b + 1); int cnt = 0; int res = 0; c[0].fa = c[0].len = 0; for(int i = 1; i <= n; i++) { if(a[i] != b[i]) cnt++; c[i].fa = cnt * 100 - i *p; c[i].len = i; } sort(c,c + n + 1,cmp); for(int i = 1, j = c[0].len; i <= n; i++) if(j < c[i].len) res = max(res,c[i].len - j); else j = c[i].len;//如果j大于c[i].len就要更新j的长度进行比较 类似与求最大的串的和。。 if(res > 0) printf("%d\n",res); else printf("NO solution.\n"); } return 0; }
相关文章推荐
- android GMS认证之testScreenCaptureDisabled_allowedPrimaryUser
- AOJ 0118 Property Distribution(dfs 求连通块)
- MySQL性能优化的最佳经验,随时补充
- 我的vim配置
- JDBC的驱动是如何加载的
- cookie 和 session
- 网络的几个基本点
- 码农小汪之Alibaba-fastjson的基本使用
- WCF发布后远程访问的域名解析问题
- 面经
- 自学考试-“操作系统概论”
- 【bzoj2351】[BeiJing2011]Matrix hash表+双hash
- 浪漫的表白 。刚接触编程语言 ,一个学长做的题。其实很简单,就是找规律输出,只是觉得输出特别浪漫,所以在此作为我人生第一个博客文章!!哈哈,大神之路 走起
- Python:使用Matplotlib绘图
- python 出现错误 SyntaxError: Non-ASCII character 的解决方法
- 数据库锁的种类
- progresql - 常用的管理命令
- listview中的radiobutton实现单选的两种方式而且可以控制另一控件button的是否可见
- 1-1-JS中的HTML属性操作
- MySQL性能分析