Codeforces E Post Lamps

E Post Lamps 

思路:

条件:照亮[0,n]段,选一种灯泡订购,灯泡有价格和向后照射长度,设置了不能放置的位置

1、计算可以选择的最短长度,因为有blocked,因此必须从其前一格放置灯,并且覆盖blocked区域。

计算blocked 的方法:

(1) [0,1,2,3,4,5,6]  3,4,5 不能用,必须选择长度大于等于[2,6] = 4

(2)[0,1,2,3,4,5,6] 0 不能用[0,1] 肯定照射不到 输出-1

(3)[0,1,2,3,4]  覆盖长度max([1,3],[3,4])

取最小花费:

遍历K,从max_blocked 开始计算花费:  

如  [0,.....,n] ,给定K,从位置i,走K步i+K,i=i+K ,一直到 i>=n

 期间如果i = is blocked,需要blocked 得到blocked前面第一个非blocked。(这里在输入的时候记录一下就好了)

 

代码:

C++ 11

#include<bits/stdc++.h>
using namespace std;
int s[1000000+10],sl[1000000+10];
bool vis[2000000+10];
int a[1000000+10];
struct price
{
    int a;//单价
    int l;//可照明长度
}P[1000000+10];
int main() {
    int n,m,k;
	scanf("%d%d%d",&n,&m,&k);
    int max_block=0,l=1;
	memset(vis,0,sizeof(vis));
	memset(s,-1,sizeof(s));
    for(int i=0;i<m;i++){
		scanf("%d",&s[i]);
		vis[s[i]] = 1;
		if(i==0) {
			sl[s[i]] = s[i] -1; 
			continue;
		}
        if(s[i]==s[i-1]+1) {
			l += 1; 
			sl[s[i]] = sl[s[i-1]];
		}
        else{
            max_block = max(l+1,max_block);
			sl[s[i]] = s[i]-1;
			l = 1;
        }
    } 
	int x = 0;
	if(l>1&&s[m-1]==n) max_block = max(l,max_block);
	else if(l>1) max_block = max(l+1,max_block);
	else if(m==1&&s[m-1]==n) max_block =max(l,max_block);
	else if(m==1) max_block =max(l+1,max_block);
    for(int i=0;i<k;i++) {
		scanf("%d",&a[i]);
        if(i+1>=max_block) {
            P[x].a = a[i],P[x].l = i+1,x++;//只能选这些
        }
    }
    if(max_block>k||s[0]==0) printf("-1\n");
    else{
        long long ans = 1e13;
		for(int i=0;i<x;i++){
			long long tmp = 0;
			int r =0; 
			while(r<n){
				tmp += P[i].a;
				r = r+P[i].l;
				if(vis[r]==1) r = sl[r];
			}	
			ans = min(ans,tmp);
		}
		printf("%lld\n",ans);
    }
	return 0;

}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值