zoukankan      html  css  js  c++  java
  • 【USACO Feb 2014】Cow Decathlon

    题目描述

    约翰有 N 头奶牛,组成了一直队伍参加全能比赛。比赛一共有 N 项,每头奶牛必须参加一项比
    赛,每项比赛也必须有一头奶牛参加。任何一头奶牛可以胜任任何一项比赛,但得分不一样。如果第
    i 头奶牛参加第 j 项比赛,在比赛结束的时候,可以为团体总分增加 S i,j 。
    比赛是按照顺序依次进行的。除了上述获得分数的方法之外,还有 B 种奖励分。获得奖励的方法
    是在前几项比赛里获得足够的分数。具体来说,第 i 项奖励会在第 K i 项比赛结束的时候检查,如果
    当时的总分大于或等于 P i ,奶牛们就可以立即获得额外的 A i 分。如果有多项奖励在同一时刻检查,
    奶牛可以自由安排检查和加分的顺序。请问约翰应该如何安排奶牛参加比赛,才能让它们获得最高的
    分数? 

    输入

    • 第一行:两个整数 N 和 B,1 ≤ N ≤ 20, 1 ≤ B ≤ 20
    • 第二行到第 B + 1 行:第 i + 1 行有三个整数 K i ,P i 和 A i ,1 ≤ K i ≤ N, 1 ≤ P i ≤ 40000,
    1 ≤ A i ≤ 1000
    • 第 B + 2 行到第 B + N + 1 行:第 i + B + 1 行有 N 个整数,代表 S i,1 到 S i,N ,对每个
    1 ≤ j ≤ N, 1 ≤ S i,j ≤ 1000

    输出

    • 单个整数:表示奶牛们可以获得的最大得分

    样例输入

    3 1 2 7 6 5 1 7 2 2 4 4 2 1

    样例输出

    17

    提示

    第一项比赛由第一头奶牛参加,第二项比赛

    由第三头奶牛参加,第三项比赛由第二头奶牛参加
     
    题解:
    n<=20 ->状压DP
    然后定义F[i]表示i状态的奶牛,设now为i中1的数量,参加前now场比赛的最大得分
    至于额外分这个东西,我把与比赛a有关的额外分都存在一个vector里 然后贪心 按pi从小到大排序
     1 #include<iostream>
     2 #include<cstdio>
     3 #include<cstring>
     4 #include<algorithm>
     5 #include<vector>
     6 using namespace std;
     7 const int N=20;
     8 struct node{
     9     int p,add;
    10 };
    11 vector<node>q[N+5];
    12 int s[N+5][N+5],F[1<<N];
    13 bool cmp(const node &p,const node &q){return p.p<q.p;}
    14 int getday(int x)
    15 {
    16     int cnt=0;
    17     while(x)
    18     {
    19         cnt++;
    20         x-=(x&(-x));
    21     }
    22     return cnt;
    23 }
    24 int main()
    25 {
    26     int n,m,x,y,z;
    27     scanf("%d%d",&n,&m);
    28     for(int i=1;i<=m;i++)
    29     {
    30         scanf("%d%d%d",&x,&y,&z);
    31         q[x].push_back((node){y,z});
    32     }
    33     for(int i=1;i<=n;i++)sort(q[i].begin(),q[i].end(),cmp);
    34     for(int i=1;i<=n;i++)
    35     for(int j=1;j<=n;j++)
    36     scanf("%d",&s[i][j]);
    37     int mk=(1<<n)-1,now,tmp;
    38     for(int i=0;i<mk;i++)
    39     {
    40         now=getday(i);
    41         for(int j=1;j<=n;j++)
    42         {
    43             if((1<<(j-1))&i)continue;
    44             tmp=F[i]+s[j][now+1];
    45             for(int k=0,sz=q[now+1].size();k<sz;k++)
    46             if(tmp>=q[now+1][k].p)tmp+=q[now+1][k].add;
    47             F[i|(1<<(j-1))]=max(F[i|(1<<(j-1))],tmp);
    48         }
    49     }
    50     printf("%d",F[mk]);
    51     return 0;
    52 }
  • 相关阅读:
    安装Windows 和 Linux双系统(vmware) Centos7
    Nginx
    rsync详细配置
    19、Squid代理服务器
    5、SAMBA服务二:配置实例
    5、SAMBA服务一:参数详解
    4、NFS
    1、网络基本配置
    Spring data mongodb使用
    win下MongoDB使用
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7002489.html
Copyright © 2011-2022 走看看