当前位置: 代码迷 >> 综合 >> 【时间复杂度】Codeforces990E Post Lamps
  详细解决方案

【时间复杂度】Codeforces990E Post Lamps

热度:36   发布时间:2023-09-27 07:31:06.0

题意:

在一个区间[0,n](注意是区间!)中,放入一些线段使得其能够覆盖所有位置。
放入线段的长度存在一个最大值lmaxlmax,对于每一个lxlx,都有相应的花费。

放入线段的规则是,如果在第i处放入长为lxlx线段,能够覆盖[i,i+lxlx]。
有k个位置不能放。

并且只能使用同一种长度的线段。

求最小花费


分析:

这又是那个恶心的式子:
n1+n2+n3++nnn1+n2+n3+……+nn数量级约等于nlognnlogn
然后暴力就可以了。。。。。

#include<cstdio>
#include<cstring>
#include<algorithm>
#define SF scanf
#define PF printf
#define MAXN 1000020
using namespace std;
long long a[MAXN];
bool used[MAXN];
int near[MAXN];
int n,k,l,x;
int main(){int n;SF("%d%d%d",&n,&k,&l);for(int i=0;i<k;i++){SF("%d",&x);used[x]=1;}for(int i=1;i<n;i++){if(used[i]==0)near[i]=i;elsenear[i]=near[i-1];}for(int i=1;i<=l;i++)SF("%lld",&a[i]);long long ans=-1;if(used[0]==1){PF("-1");return 0;}int minle=1,cnt=0;for(int i=1;i<=n;i++){if(used[i]==1)cnt++;elsecnt=0;minle=max(minle,cnt+1);}for(int i=minle;i<=l;i++){int now=0;long long ans1=0;for(;now<n;now+=i,ans1+=a[i])now=near[now];if(ans1!=-1){if(ans==-1)ans=ans1;ans=min(ans,ans1);}}PF("%lld",ans);
}
  相关解决方案