题意: 解法: 暴力跳的复杂度是O(n/1+n/2+....)=O(n*log). 但是有m个位置被禁止了,每次遇到被禁止的位置,我们需要回退到左边第一个未被禁止的位置(可以预处理), 然后放路灯,回退造成的额外复杂度大概是O(m/1+m/2....)=O(m*log)? 总复杂度在可接受范围内. code: #include<bits/stdc++.h> #define int long long using namespace std; const int maxm=2e6+5; int mark[maxm]; int l[maxm]; int a[maxm]; int n,m,k; int cal(int x){ int now=0; int cnt=0; while(now<n){ if(!mark[now]){ now+=x; cnt++; }else{ if(l[now]<x&&now-l[now]>=0){ now=now-l[now]+x; cnt++; }else{ return -1; } } } return cnt; } void solve(){ cin>>n>>m>>k; for(int i=1;i<=m;i++){ int x;cin>>x; mark[x]=1; } for(int i=1;i<=k;i++){ cin>>a[i]; } if(mark[0])l[0]=1; for(int i=1;i<n;i++){ if(mark[i]){ l[i]=l[i-1]+1; }else{ l[i]=0; } } int ans=1e18; for(int i=1;i<=k;i++){ int cnt=cal(i); if(cnt!=-1){ ans=min(ans,cnt*a[i]); } } if(ans==1e18)ans=-1; cout<<ans<<endl; } signed main(){ ios::sync_with_stdio(0);cin.tie(0); solve(); return 0; }