您的位置:首页 > 其它

湖南工业大学个人选拔赛第二场 解题报告

2013-04-16 19:08 344 查看
A:连续子串和

贪心题,枚举每一个数字作为结束点。保留前i位的前缀和sum[i],对于第i为结束的合法序列,其值为sum[i]-sum[i-K],sum[i]-sum[i-K-1],...,sum[i]-sum[0],那么我们只需要对每一个 i 保留sum[0]到sum[i-K]的最小值即可。

View Code

// File Name: 1494: 连续子串和续
// Author: sheng
// Created Time: 2013年04月14日 星期日 21时13分17秒

#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;

const int Max = 1e6+5;
const int INF = 0x7fffffff;

int n, k;
int a[Max], b[Max];
double bz[Max];
/*
int min(int a, int b)
{
return a < b ? a:b;
}
*/
int ac(double p)
{
double Min = INF;
bz[0] = 0;
for (int i = 1; i <= n; i ++)
bz[i] = bz[i-1] + a[i] - p*b[i];
for (int i = k; i <= n; i ++)
{
Min = min(Min, bz[i-k]);
if (bz[i] - Min >= 0)
return 1;
}
return 0;
}

double bsearch(double l, double r)
{
double mid, ret;
while (r - l > 1e-8)
{
mid = (l+r) / 2;
if (ac(mid))
{
ret = mid;
l = mid + 1e-8;
}
else
r = mid - 1e-8;
}
return ret;
}

int main()
{
while (~scanf ("%d%d", &n, &k))
{
for (int i = 1; i <= n; i ++)
scanf ("%d", &a[i]);
for (int i = 1; i <= n; i ++)
scanf ("%d", &b[i]);
printf ("%.4lf\n", bsearch(0, 1000));
}
return 0;
}
/**************************************************************
Problem: 1494
User: 12408300128
Language: C++
Result: Accepted
Time:2647 ms
Memory:17056 kb
****************************************************************/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: