枚举每种灯管,然后找到代价最小的那种灯管
贪心策略:灯管从0开始向右放置,如果末尾是不能放置灯管的结点,那么要往回找到最近一个可以放置灯管的结点,在那里放置灯管
所以先预处理每个不能放置灯管的结点对应的最近的可以放置灯管的结点,即要能够自动往前找下标
using namespace std; int a[maxn]; int b[maxn]; int n,m,k; LL work(int ins) { LL ans=0; int id=0; while(id<=n) { if(id+ins>=n) { ans++; break; } id=a[id+ins]; ans++; } return ans*b[ins]; } int main() { while(~scanf("%d%d%d",&n,&m,&k)) { lan(a,0); lan(b,0); For(i,1,m) { int tem; scanf("%d",&tem); a[tem]=1; } For(i,1,k) { int tem; scanf("%d",&b[i]); } if(a[0]==1) { printf("-1 "); continue; } int id=0; int curlen=0; int maxlen=0; For(i,1,n) { if(a[i]==0) { a[i]=i; id=i; } else { a[i]=id; } maxlen=max(maxlen,i-a[i]); } if(maxlen>=k) { printf("-1 "); continue; } LL ans=1LL<<60; For(i,maxlen+1,k) { ans=min(ans,work(i)); } printf("%lld ",ans); } return 0; }