题目链接:http://www.ifrog.cc/acm/problem/1121
1121 - Reverse the lights
Time Limit:2s Memory Limit:256MByte
Submissions:312Solved:93
DESCRIPTION
有n个灯,初始时都是不亮的状态,每次你可以选择一个某一个灯,不妨记为x,所有满足和x距离不超过k的灯的状态都将被翻转,选择第i个灯的代价记为ci,问最终所有灯都是亮的状态的最小花费.
INPUT
输入有两行,第一行包含两个正整数
n(1≤n≤10000)和k(0≤k≤1000)第二行包含
n个整数,分别表示
ci(0≤ci≤109)
OUTPUT
输出一行表示答案
SAMPLE INPUT
3 1
1 1 1
SAMPLE OUTPUT
1
SOLUTION
解析:暴力遍历1~k+1,选出最优解,注意处理不成立的情况
代码:
#include<bits/stdc++.h>
#define N 300009
using 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;
//}