zoukankan      html  css  js  c++  java
  • Codeforces Round #327 (Div. 1) D. Top Secret Task

    D. Top Secret Task
    time limit per test
    3 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    A top-secret military base under the command of Colonel Zuev is expecting an inspection from the Ministry of Defence. According to the charter, each top-secret military base must include a top-secret troop that should... well, we cannot tell you exactly what it should do, it is a top secret troop at the end. The problem is that Zuev's base is missing this top-secret troop for some reasons.

    The colonel decided to deal with the problem immediately and ordered to line up in a single line all n soldiers of the base entrusted to him. Zuev knows that the loquacity of the i-th soldier from the left is equal to qi. Zuev wants to form the top-secret troop using k leftmost soldiers in the line, thus he wants their total loquacity to be as small as possible (as the troop should remain top-secret). To achieve this, he is going to choose a pair of consecutive soldiers and swap them. He intends to do so no more than s times. Note that any soldier can be a participant of such swaps for any number of times. The problem turned out to be unusual, and colonel Zuev asked you to help.

    Determine, what is the minimum total loquacity of the first k soldiers in the line, that can be achieved by performing no more than s swaps of two consecutive soldiers.

    Input

    The first line of the input contains three positive integers nks (1 ≤ k ≤ n ≤ 150, 1 ≤ s ≤ 109) — the number of soldiers in the line, the size of the top-secret troop to be formed and the maximum possible number of swap operations of the consecutive pair of soldiers, respectively.

    The second line of the input contains n integer qi (1 ≤ qi ≤ 1 000 000) — the values of loquacity of soldiers in order they follow in line from left to right.

    Output

    Print a single integer — the minimum possible total loquacity of the top-secret troop.

    Sample test(s)
    input
    3 2 2
    2 4 1
    output
    3
    input
    5 4 2
    10 1 6 2 5
    output
    18
    input
    5 2 3
    3 1 4 2 5
    output
    3
    Note

    In the first sample Colonel has to swap second and third soldiers, he doesn't really need the remaining swap. The resulting soldiers order is: (2, 1, 4). Minimum possible summary loquacity of the secret troop is 3. In the second sample Colonel will perform swaps in the following order:

    1. (10, 1, 6 — 2, 5)
    2. (10, 1, 2, 6 — 5)

    The resulting soldiers order is (10, 1, 2, 5, 6).

    Minimum possible summary loquacity is equal to 18.

    解题报告:

    dp( i , j , k )表示正在考虑第 i 个数,同时已经安排了j个,用了k次交换的机会的最小值

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <algorithm>
    using namespace std;
    const int maxn = 150 + 15;
    int n , kk , s , q[maxn] , dp[2][maxn][maxn*maxn/2] , cur , errorcode , enf;
    
    void updata(int & x,int v){
        x = min( x , v );
    }
    
    int main(int argc,char *argv[]){
        scanf("%d%d%d",&n,&kk,&s);enf = n * (n  - 1 ) / 2;
        for(int i = 0 ; i < n ; ++ i) scanf("%d" , q + i);
        if(s >= enf) {
            sort( q , q + n);
            int ans = 0;
            for(int i = 0 ; i < kk ; ++ i) ans += q[i];
            printf("%d
    ",ans);
        }
        else{
            memset(dp[cur] , 0x3f , sizeof(dp[cur])); errorcode = dp[cur][0][0];
            dp[cur][0][0] = 0;
            for(int i = 0 ; i < n ; ++ i){
                int pre = cur ; cur ^= 1 ; memset(dp[cur] , 0x3f , sizeof(dp[cur]));
                for(int j = 0 ; j <= min( i , kk ) ; ++ j){
                    for(int k = 0 ; k <= s ; ++ k){
                        if(dp[pre][j][k]!=errorcode){
                            updata(dp[cur][j][k] , dp[pre][j][k]);
                            if(j != kk && i - j + k <= s) updata( dp[cur][j+1][k + i - j] , dp[pre][j][k] + q[i] );
                        }
                    }
                }
            }
            int ans = errorcode;
            for(int i = 0 ; i <= s ; ++ i) ans = min( ans , dp[cur][kk][i]);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    《基于玩家分享行为的手游传播模式研究》
    并行多核体系结构基础——第四章知识点和课后习题
    numpy中的nan和常用方法
    《基于多层复杂网络的传播行为建模与分析》
    《基于SD-SEIR模型的实验室人员不安全行为传播研究》
    《基于SIR的路边违停行为传播模型研究》
    《基于SIRS模型的行人过街违章传播研究》
    阿里巴巴编码规范-考试认证
    测试菜鸟!!当领导我问:“测得怎么样了?”我慌到一P
    国内软件测试过度吹捧自动化测试,然而在国外是这样子的
  • 原文地址:https://www.cnblogs.com/Xiper/p/4916174.html
Copyright © 2011-2022 走看看