• 1198: [HNOI2006]军机调度


    Description

    凯萨拥有一支由n个人组成的雇佣军,他们靠在威尼斯商行接任务过活。这支军队的成份比较复杂,不同的人往往具有不同的技能,有的人还拥有多项技能。威尼斯商行的任务也参差不齐,有的需要几个人合作完成,有的只需要一个人独立完成:有的很简单,不需要耗多少时间,因此报酬也较低,有的很有难度,需要多个人长期合作完成,因此报酬就高。完成这些任务的时间不会超过一个月。并且,一个人不能同时执行两项任务,也不能中途加入或者退出任务。但可以不执行任何任务。一项只需要n个人来完成的任务,如果执行该任务的人数p大于n,那么反而会得到更少的报酬,即原报酬的1/(p-n+1)。
      凯萨是一位英明的领袖,他往往在每个月的月底召开军事会议,总结上个月的成果,发给大家报酬,并指派下个月的任务。
      请问,凯萨应该怎样指派任务,才能使总报酬最高?总报酬为多少?

    Input

    一行包含两个正整数n,m。彼此用空格隔开,其中n〈10表示雇佣军的人数,m〈15表示下个月可选的任务数。接下来的n行中,第i行(对应整个文件的第i+1行)的第一个整数小于等于表示编号为i的雇佣军可以执行的任务数,后面的整数是编号为i的雇佣军可以执行的所有任务的编号,这些整数之间用空格隔开。最后的m行中,每行有四个整数b、e、p和r,彼此之间用空格隔开,其中第j行(对应整个文件的第n+j+1行)是编号为j的任务的描述:0 〈 b 〈 32表示该任务的开始日(这一天会被计入任务所需的时间中),0 < e〈32表示该任务的结束日(这一天也会被计入任务所需的时间中),p 〈 10表示该任务所需人数,0 〈 r 〈 100000表示该任务的报酬。

    Output

    第一行只有一个整数t,表示最多可获得的总报酬,

    Sample Input

    3 5

    2 1 4

    2 2 4

    3 3 4 5

    2 20 1 100

    1 18 1 200

    3 28 1 800

    21 30 3 1500

    19 21 1 400

    Sample Output

    1800

    竟然是真的,爆搜就可以AC了

    不敢想象,为什么要这么出水题,我还以为有什么算法在里面呢

     1 var
     2     n,m,ans:longint;
     3     flag:array[0..10,0..15]of boolean;
     4     time:array[0..10]of longint;
     5     s,t,p,v:array[0..15]of longint;
     6     a:array[0..10,0..1024]of longint;
     7  
     8 procedure swap(x,y:longint);
     9 var
    10     i,ti:longint;
    11     ss:boolean;
    12 begin
    13     for i:=1 to n do
    14       begin
    15         ss:=flag[i,x];
    16         flag[i,x]:=flag[i,y];
    17         flag[i,y]:=ss;
    18       end;
    19     ti:=s[x];s[x]:=s[y];s[y]:=ti;
    20     ti:=t[x];t[x]:=t[y];t[y]:=ti;
    21     ti:=p[x];p[x]:=p[y];p[y]:=ti;
    22     ti:=v[x];v[x]:=v[y];v[y]:=ti;
    23 end;
    24  
    25 procedure init;
    26 var
    27     i,j,k,x:longint;
    28 begin
    29     read(n,m);
    30     for i:=1 to n do
    31       begin
    32         read(k);
    33         for j:=1 to k do
    34           begin
    35             read(x);
    36             flag[i,x]:=true;
    37           end;
    38       end;
    39     for i:=1 to m do
    40       read(s[i],t[i],p[i],v[i]);
    41     for i:=1 to 1<<n-1 do
    42       begin
    43         k:=0;
    44         for j:=1 to n do
    45           if i and (1<<(j-1))>0 then inc(k);
    46         inc(a[k,0]);
    47         a[k,a[k,0]]:=i;
    48       end;
    49     for i:=m-1 downto 1 do
    50       for j:=1 to i do
    51         if s[j]>s[j+1] then swap(j,j+1);
    52 end;
    53  
    54 procedure dfs(x,y:longint);
    55 var
    56     i,j:longint;
    57     save:array[0..10]of longint;
    58     can:boolean;
    59 begin
    60     if x>m then
    61     begin
    62       if y>ans then ans:=y;
    63       exit;
    64     end;
    65     dfs(x+1,y);
    66     save:=time;
    67     for i:=1 to a[p[x],0] do
    68       begin
    69         can:=true;
    70         for j:=1 to n do
    71           if a[p[x],i] and (1<<(j-1))>0 then
    72           begin
    73             if (flag[j,x])and(time[j]<s[x]) then time[j]:=t[x]
    74             else
    75               begin
    76                 can:=false;
    77                 break;
    78               end;
    79           end;
    80         if can then dfs(x+1,y+v[x]);
    81         time:=save;
    82       end;
    83 end;
    84  
    85 begin
    86     init;
    87     dfs(1,0);
    88     write(ans);
    89 end.
    View Code
  • 相关阅读:
    vs code插件
    各大厂RTSP取流的URI
    关于VLC无法播放rtsp的问题分析
    VLC查看日志的方法
    wireshark的过滤命令
    vs编译完提示不支持尝试的执行操作
    vs2015的密钥
    VS制作dll、def文件的使用、dll加入工程使用
    python之NLP数据清洗
    python 生成词云
  • 原文地址:https://www.cnblogs.com/Randolph87/p/3591977.html
Copyright © 2020-2023  润新知