“玲珑杯”线上赛 Round #15 A Reverse the lights(dp)

来源:互联网 发布:2手车评估软件 编辑:程序博客网 时间:2024/05/22 07:04

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 11 1 1
SAMPLE OUTPUT
1


思路:对于每一次的操作,显然其周围的2k个灯不会有状态翻转,否则这次就是无效的,于是转换为简单的动态规划问题.令dp(i)表示将前i+k个灯全部点亮的最小花费,直接转移即可.
时间复杂度:O(n)


代码:

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;const int maxn=10010;const long long INF = 1e13;int n, k;long long dp[maxn], c[maxn];int main() {    scanf("%d%d",&n,&k);    for(int i = 1; i <= n; i++)       scanf("%lld", &c[i]);    for(int i = 0; i <= n; i++)        dp[i] = INF;    long long ans = INF;    //1...k,k+1,打开里面任意一盏灯,其左侧灯会全亮 for(int i = 1; i <= 1 + k; i++){        if(i > n) break;//超过n即停止         dp[i] = c[i];        if(i + k >= n) ans = min(ans, dp[i]);    }    for(int i = 2 * k + 2; i <= n; i++){        dp[i] = dp[i - k - k - 1] + c[i];        if(i + k >= n)             ans = min(ans, dp[i]);    }    printf("%lld\n",ans);    return 0;}




阅读全文
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 5个月宝宝怕洗澡怎么办 4个月宝宝认人怎么办 2岁宝宝语言迟缓怎么办 宝宝老是哭闹不睡觉怎么办 7岁儿童说话晚怎么办 一岁多的婴儿说话晚该怎么办 宝宝甲低300多怎么办 两岁半宝宝还不怎么会讲话怎么办 宝宝两岁半了还不讲话怎么办 两岁宝宝怕生人怎么办 四岁宝宝不说话怎么办 1岁宝宝牙齿黄斑怎么办 儿子俩周半了就是不说话怎么办 两岁宝宝牙齿上有黑渍怎么办 两岁宝宝牙齿发黑怎么办 求帮助宝宝刷牙不会漱口怎么办 牙膏不小心吞了怎么办 宝宝误吃了牙膏怎么办 宝宝吃了30g牙膏怎么办 孩子把牙膏吞了怎么办 二岁宝宝有蛀牙怎么办 3岁宝宝有蛀牙了怎么办 三岁宝宝夜惊怎么办 小班孩子跳舞不好好跳怎么办 15个月宝宝拉稀怎么办 孩子学习不认真该怎么办 孩子学习不自觉该怎么办 孩子学习压力大该怎么办 分手发信息不回怎么办 两岁宝宝不会回答问题怎么办 分手了我还想他怎么办 两岁宝宝特别不听话怎么办 2岁宝宝争东西怎么办 两岁宝宝钙吸收不好怎么办 1岁宝宝害羞胆小怎么办 2岁宝宝害羞胆小怎么办 6个月的宝宝胆小怎么办 3岁半宝宝很胆小怎么办 分手了想他了怎么办 分手了还想联系怎么办 2岁多宝宝不长肉怎么办