codevs3369膜拜
Posted 那一抹落日的橙
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codevs3369膜拜相关的知识,希望对你有一定的参考价值。
这个题开始我以为能够通过先预处理能够被分到一个机房的区间来转化成线段覆盖问题,然而失败,可能不行qwq
然后我又换了种思路,用dp[i]表示从1到i位置,至少需要分成几个机房,然后枚举中间断点,时间复杂度o(n)
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> using namespace std; int n,m,a[2510],s1[2520],ans[2520],tail,s2[2520]; int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); for(int i=1;i<=n;i++) { s1[i]=s1[i-1],s2[i]=s2[i-1]; if(a[i]==1) s1[i]++; else s2[i]++; } memset(ans,127,sizeof(ans));//初始化答案极大值 ans[0]=0; for(int i=1;i<=n;i++) for(int j=1;j<=i;j++) { if(abs(s1[i]-s1[j-1]-s2[i]+s2[j-1])<=m||s1[i]-s1[j-1]==i-j+1||s2[i]-s2[j-1]==i-j+1)//判断j-i是否能分在一个机房里 ans[i]=min(ans[i],ans[j-1]+1);//dp[i]=min(dp[i],dp[j-1]+1);i为当前位置,从1-i分成两部分,1-j-1和1-i } printf("%d",ans[n]); }
以上是关于codevs3369膜拜的主要内容,如果未能解决你的问题,请参考以下文章