hdu 2993 斜率优化DP

直接看论文即可做

给个论文链接:点击打开链接里面的例二就是

AC代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;

#define MAX 0x3f3f3f3f

double sum[110000], ans;
int pos[110000], s, e;
int N, K;

int getInt(){//没这个这题过不了
    char ch = getchar();
    while( ch < '0' || ch > '9' )   ch = getchar();
    int num = 0;
    while( ch >= '0' && ch <= '9' ){
        num = num * 10 + ch - '0';
        ch = getchar();
    }
    return num;
}

int main(){

    while( scanf( "%d%d", &N, &K ) != EOF ){

        sum[0] = 0;
        for( int i = 1; i <= N; i++ ){
            int temp = getInt();
            sum[i] = temp + sum[i-1];
        }

        s = 0, e = -1;
        ans = -MAX;
        for( int i = 0; i + K <= N; i++ ){

            while( s < e ){
                double k1 = ( sum[i] - sum[pos[e]] ) / ( i - pos[e] );
                double k2 = ( sum[pos[e]] - sum[pos[e-1]] ) / ( pos[e] - pos[e-1] );
                if( k2 >= k1 ){
                    e--;
                }else{
                    break;
                }
            }
            pos[++e] = i;

            while( s < e ){
                double k1 = ( sum[i+K] - sum[pos[s]] ) / ( i + K - pos[s] );
                double k2 = ( sum[i+K] - sum[pos[s+1]] ) / ( i + K - pos[s+1] );
                if( k2 >= k1 ){
                    s++;
                }else{
                    break;
                }
            }

            double temp = ( sum[i+K] - sum[pos[s]] ) / ( i + K - pos[s] );
            ans = max( ans, temp );
        }

        printf( "%.2lf\n", ans );
    }

    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值