• C++-POJ1015-Jury Compromise


    Java实现会MLE那我也没办法了

    1 //辩方总分和控方总分之差简称为“辩控差”
    2 //辩方总分和控方总分之和简称为“辩控和”
    3 //现用f(j, k)表示,取j 个候选人,使其辩控差为k 的所有方案中,辩控和最大的那个方案
    4 //规定,如果没法选j 个人,使其辩控差为k,那么f(j, k)的值就为-1,称方案f(j, k)不可行
    5 //那么,如果对k 的所有可能的取值,求出了所有的f(m, k) (-20×m≤ k ≤ 20×m),那么陪审团方案自然就很容易找到了
    6 //显然,方案f(j, k)是由某个可行的方案f(j-1, x) (-20×m ≤ x ≤ 20×m)演化而来的
    7 //而且,由于题目中辩控差的值k 可以为负数,而程序中数租下标不能为负数
    8 //所以,在程序中不妨将辩控差的值都加上20*m,以免下标为负数导致出错
     1 #include<vector>
     2 #include<cstdio>
     3 #include<iostream>
     4 using namespace std;
     5 int dp[21][801],sub[201],sum[201];
     6 vector<int> path[21][801];
     7 int main() {
     8     for(int n,m,Case=0;~scanf("%d%d",&n,&m) && n && m;) {
     9         for(int i=0; i<21; i++)for(int j=0; j<801; j++)path[i][j].clear();//清空vector
    10         for(int i=0; i<21; i++)for(int j=0; j<801; j++)dp[i][j]=-1;
    11         for(int i = 1,d,p; i <= n; i++) cin>>d>>p,sub[i] = d-p,sum[i] = d+p;
    12         int ans = 20*m,x;
    13         dp[0][ans] = 0;
    14         int time1=0;
    15         for(int k = 1; k <= n; k++)//选择一个
    16             for(int i = m-1; i >= 0; i--)//进行逆推
    17                 for(int j = 0; j < 2*ans; j++) 
    18                     if(dp[i][j] >= 0) {
    19                         if(dp[i+1][j+sub[k]] <= dp[i][j] + sum[k]) {
    20                             dp[i+1][j+sub[k]] = dp[i][j] + sum[k];
    21                             path[i+1][j+sub[k]] = path[i][j];//每次更新都要把path全部复制过来,就是因为这个才用的vector
    22                             path[i+1][j+sub[k]].push_back(k);
    23                         }
    24                     }
    25         for(x = 0; dp[m][ans+x] == -1 && dp[m][ans-x] == -1; x++);
    26         int temp = (dp[m][ans+x] > dp[m][ans-x]) ? x : -x;
    27         int sumD = (dp[m][ans+temp] + temp )/2;
    28         int sumP = (dp[m][ans+temp] - temp )/2;
    29         printf( "Jury #%d
    ",++Case);
    30         printf( "Best jury has value %d for prosecution and value %d for defence:
    ", sumD,sumP);
    31         for(int i=0; i < m; i++ )printf( " %d", path[m][ans+temp][i]);
    32         printf( "
    
    " );
    33     }
    34     return 0;
    35 }
    ~~Jason_liu O(∩_∩)O
  • 相关阅读:
    Wireshark的简介
    Node.js + Express 构建的订餐系统
    java 文件下载支持中文名称
    java判断A字符串中是否包含B字符
    Java查询目录下的所有文件(包括子目录)
    Java从指定URL下载文件并保存到指定目录
    Java逻辑分页代码
    JS实现文字向上无缝滚动轮播
    JAVA调用外部安装7-Zip压缩和解压zip文件
    Zip文件和RAR文件解压
  • 原文地址:https://www.cnblogs.com/JasonCow/p/12257105.html
Copyright © 2020-2023  润新知