1121

来源:互联网 发布:服务器基础知乎 编辑:程序博客网 时间:2024/05/18 00:23

题目链接:http://www.ifrog.cc/acm/problem/1121

1121 - Reverse the lights

Time Limit:2s Memory Limit:256MByte

Submissions:312Solved:93

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
SOLUTION
“玲珑杯”ACM比赛 Round #15
Submit summary Discuss

解析:暴力遍历1~k+1,选出最优解,注意处理不成立的情况

代码:

#include<bits/stdc++.h>#define N 300009using namespace std;typedef long long LL;const LL INF = 1LL<<60;int w[N], n, k;LL solve(int s){    LL num = 0ll;    int now;    for(int j = s; j <= n; j += k*2+1)    {        num += w[j];        now = j;        //if(j + k < n && j + 2*k > n) return -1;    }    if(now + k < n) return INF;    return num;}int main(){    LL ans = INF;    while(~scanf("%d%d", &n, &k))    {        for(int i = 1; i <= n; i++) scanf("%d", &w[i]);        for(int i = 1; i <= min(k + 1, n); i++)        {            LL num = solve(i);            if(num < 0) continue;            ans = min(ans, num);        }        cout << ans << endl;    }    return 0;}//int main()//{//    LL ans = 1LL<<60;//    scanf("%d%d", &n, &k);//    int now;//    for(int i = 1; i <= n; i++) scanf("%d", &w[i]);//    for(int i = 1; i <= min(k + 1, n); i++)//    {//        LL sum = 0;//        for(int j = i; j<=n; j+=2*k+1)//        {//            now = j;//            sum += w[j];//        }//        if(now + k>=n)//            ans = min(ans, sum);//    }//    cout<<ans<<endl;//    return 0;//}



原创粉丝点击