Misha and Palindrome Degree

本文介绍了一个关于寻找最小区间的贪心算法解决方法,用于解决Codeforces上MishaandPalindromeDegree问题。通过去除相同的两端并找到包含不同字符区间的最小范围,实现了高效的求解。

Misha and Palindrome Degree

题目链接:http://codeforces.com/problemset/problem/501/E

贪心

如果区间[L,R]满足条件,那么区间[L',R'](L'<=L,R<=R')必然满足条件,所以只需要找到满足条件的最小区间即可。首先去除两边相同的区间,剩下的区间为[l,r],因为区间[l,r]的两端不相同,所以要找的最小区间必然包含区间[l,r]的最左端或者最右端。观察到所选区间内的同种元素个数必需大于等于整个区间内同种元素的个数,以此来找到最小区间。

计算区间个数的示意图:

代码如下:

 1 #include<cstdio>
 2 #include<cstring>
 3 #define N 100000
 4 #define LL long long
 5 using namespace std;
 6 LL a[N+5];
 7 LL cnt[N+5];
 8 LL jud[N+5];
 9 LL n,l,r,single,sum;
10 int main(void){
11     scanf("%I64d",&n);
12     for(LL i=0;i<n;++i){
13         scanf("%I64d",a+i);
14         cnt[a[i]]++;
15     }
16     for(LL i=0;i<=n;++i)
17         if(cnt[i]&1)single++;
18     if(single>1){
19         printf("0\n");
20         return 0;
21     }
22     for(l=0;l<=(n>>1);++l){
23         if(a[l]==a[n-1-l])cnt[a[l]]-=2;
24         else break;
25     }
26     r=n-1-l;
27     if(l>=r){
28         printf("%I64d\n",n*(n+1)/2);
29         return 0;
30     }
31     LL left=r;
32     for(;left>=l;--left){//缩小(l,left)的区间
33         jud[a[left]]++;//统计(left,r)中的元素个数
34         if(jud[a[left]]*2>cnt[a[left]]){
35             if(left>((n-1)>>1))break;//区间无法继续缩小
36             if(a[left]!=a[n-1-left])break;//如果相等,区间可以更小
37             if(cnt[a[left]]%2==0&&left==n-1-left)break;//如果是中间奇数的,继续缩小
38         }
39     }
40     sum+=(r-left)*(l+1);
41     memset(jud,0,sizeof(jud));
42     int right=l;
43     for(;right<=r;++right){
44         jud[a[right]]++;
45         if(jud[a[right]]*2>cnt[a[right]]){
46             if(right<((n-1)>>1))break;
47             if(a[right]!=a[n-1-right])break;
48             if(cnt[a[right]]%2==0&&right==n-1-right)break;
49         }
50     }
51     sum+=(right-l)*(n-r);
52     sum+=(n-r)*(l+1);
53     printf("%I64d\n",sum);
54 }

 

转载于:https://www.cnblogs.com/barrier/p/5781150.html

标题基于Python的自主学习系统后端设计与实现AI更换标题第1章引言介绍自主学习系统的研究背景、意义、现状以及本文的研究方法和创新点。1.1研究背景与意义阐述自主学习系统在教育技术领域的重要性和应用价值。1.2国内外研究现状分析国内外在自主学习系统后端技术方面的研究进展。1.3研究方法与创新点概述本文采用Python技术栈的设计方法和系统创新点。第2章相关理论与技术总结自主学习系统后端开发的相关理论和技术基础。2.1自主学习系统理论阐述自主学习系统的定义、特征和理论基础。2.2Python后端技术栈介绍DjangoFlask等Python后端框架及其适用场景。2.3数据库技术讨论关系型和非关系型数据库在系统中的应用方案。第3章系统设计与实现详细介绍自主学习系统后端的设计方案和实现过程。3.1系统架构设计提出基于微服务的系统架构设计方案。3.2核心模块设计详细说明用户管理、学习资源管理、进度跟踪等核心模块设计。3.3关键技术实现阐述个性化推荐算法、学习行为分析等关键技术的实现。第4章系统测试与评估对系统进行功能测试和性能评估。4.1测试环境与方法介绍测试环境配置和采用的测试方法。4.2功能测试结果展示各功能模块的测试结果和问题修复情况。4.3性能评估分析分析系统在高并发等场景下的性能表现。第5章结论与展望总结研究成果并提出未来改进方向。5.1研究结论概括系统设计的主要成果和技术创新。5.2未来展望指出系统局限性并提出后续优化方向。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值