UVALive 4731 Cellular Network

來源:互聯網
上載者:User

標籤:code   貪心   問題   style   str   network   題解   div   pac   

題解:

也是比較簡單的DP,

貪心不難想到,大的肯定在前面最好。從大到小排序,dp[i][j] 表示前i個數分為j組

dp[i][j] = min( dp[k][j - 1], i * (sum[i] -sum[k]) );

注意精度問題。不要一開始就算。只需要最後除以sum即可

代碼:

#include<bits/stdc++.h>using namespace std;#define pb push_back#define mp make_pair#define se second#define fs first#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#define pii pair<int,int>const int INF = 1000000000;const int maxn = 105;const int M = 4000;int a[ maxn ], sum[ maxn ];int dp[ maxn ][ maxn ];int n, m;int main(){    int T;    scanf( "%d", &T );    while( T -- )    {        scanf( "%d%d", &n, &m );        for( int i = 1; i <= n; i ++ ) scanf( "%d", &a[ i ] );        sort( a + 1, a + n + 1, greater< int >() );        for( int i = 1; i <= n; i ++ ) sum[ i ] = sum[ i - 1 ] + a[ i ];        for( int i = 1; i <= n; i ++ ) dp[ i ][ 1 ] = i * sum[ i ];        for( int i = 2; i <= m; i ++ )        for( int j = i; j <= n; j ++ )        {            dp[ j ][ i ] = INF;            for( int k = i - 1; k <= j - 1; k ++ )            dp[ j ][ i ] = min( dp[ j ][ i ], dp[ k ][ i - 1 ] + j * ( sum[ j ] - sum[ k ] ) );        }        printf( "%.4lf\n",( double )dp[ n ][ m ] / ( double )sum[ n ] );    }    return 0;}

 

UVALive 4731Cellular Network

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.