题意:
在一个从0开始的连续区间上 放置几个小区间,使得这些小区间覆盖整个大区间,不同长度的小区间有不同的花费,其中有m个点,小区间的左端点不能放在这些点上
解析:
显然如果0是这m点中的一个 则无解
然后就是标记上连续不能放的点 然后遍历每一个小区间 从0开始放 求花费最小值即可
· 注意最大值的设置
代码都加了1,从1开始
#include <bits/stdc++.h> using namespace std; const int maxn = 2000006, INF = 0x7fffffffffffffff;; typedef long long LL; int vis[maxn], hip[maxn]; LL cost[maxn]; int main() { int n, m, k, tmp; scanf("%d%d%d", &n, &m, &k); n++; for(int i=0; i<m; i++) { scanf("%d", &tmp); vis[tmp+1] = 1; } if(vis[1]) { printf("-1 "); return 0; } for(int i=1; i<=k; i++) scanf("%lld", &cost[i]); for(int i=1; i<=n; i++) { if(vis[i]) hip[i] = hip[i-1]; else hip[i] = i; } LL res = LLONG_MAX; for(int i=1; i<=k; i++) { int p = 1; LL sum = 1; while(1) { if(p + i >= n) { LL ans = sum * cost[i]; res = min(res, ans); break; } if(p == hip[p+i]) break; p = hip[p+i]; sum++; } } if(res == LLONG_MAX) printf("-1 "); else printf("%lld ", res); return 0; }