“玲珑杯”线上赛 Round #15 河南专场 A -- Reverse the lights DP

来源:互联网 发布:启凡网络是培训的吗 编辑:程序博客网 时间:2024/05/19 04:05

题目链接:ifrog 1121

A -- Reverse the lights

Time Limit:2s Memory Limit:256MByte

Submissions:345Solved:101

DESCRIPTION

nn个灯,初始时都是不亮的状态,每次你可以选择一个某一个灯,不妨记为xx,所有满足和xx距离不超过kk的灯的状态都将被翻转,选择第ii个灯的代价记为cici,问最终所有灯都是亮的状态的最小花费.

INPUT
输入有两行,第一行包含两个正整数n(1n10000)k(0k1000)n(1≤n≤10000)和k(0≤k≤1000)第二行包含nn个整数,分别表示ci(0ci109)ci(0≤ci≤109)
OUTPUT
输出一行表示答案
SAMPLE INPUT
3 1
1 1 1
SAMPLE OUTPUT
1
题目分析:思路题,记dp[i]为将第i盏灯点亮后恰好前i+k盏灯全亮的话费,实际上点灯的顺序一开始在前k+1盏灯中点亮一盏后就已经固定了,只能每隔k盏灯点亮一盏,想清楚这个题基本就出了
////  main.cpp//  A Reverse the lights////  Created by teddywang on 2017/6/25.//  Copyright © 2017年 teddywang. All rights reserved.//#include <iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;typedef long long ll;ll dp[11111];int k,n;ll c[11111];int main(){    while(~scanf("%d%d",&n,&k))    {        ll ans=1e16;        for(int i=1;i<=n;i++)        {            dp[i]=1e16;            scanf("%lld",&c[i]);        }        for(int i=1;i<=k+1;i++)        {            if(i>n) break;            dp[i]=c[i];            if(i+k>=n)ans=min(ans,c[i]);        }        for(int i=2+k+k;i<=n;i++)        {            dp[i]=dp[i-k-1-k]+c[i];            if(i+k>=n) ans=min(ans,dp[i]);        }        printf("%lld\n",ans);            }}



阅读全文
0 0
原创粉丝点击