您的位置:首页 > 其它

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因此我们要从大到小的顺序进行排序才可以满足题目的要求

代码:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: