• 5294 挖地雷


    5294 挖地雷

     时间限制: 1 s

     空间限制: 1000 KB
     题目等级 : 黄金 Gold 
     
    题目描述 Description

    在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。当地窖及其连接的数据给出之后,某人可以从第一个地窖开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。

    输入描述 Input Description

    输入文件mine.in有若干行。

    第1行只有一个数字,表示地窖的个数N。

    第2行有N个数,分别表示每个地窖中的地雷个数。

    第3行至第N+1行表示地窖之间的连接情况:

    第3行有n-1个数(0或1),表示第一个地窖至第2个、第3个、…、第n个地窖有否路径连接。如第3行为1 1 0 0 0 … 0,则表示第1个地窖至第2个地窖有路径,至第3个地窖有路径,至第4个地窖、第5个、…、第n个地窖没有路径。

    第4行有n-2个数,表示第二个地窖至第3个、第4个、…、第n个地窖有否路径连接。

    … …

    第n+1行有1个数,表示第n-1个地窖至第n个地窖有否路径连接。(为0表示没有路径,为1表示有路径)。

    输出描述 Output Description

    输出文件wdl.out有两行数据。

    第一行表示挖得最多地雷时的挖地雷的顺序,各地窖序号间以一个空格分隔,不得有多余的空格。

    第二行只有一个数,表示能挖到的最多地雷数。

    样例输入 Sample Input

       

    5
    10 8 4 7 6
    1 1 1 0
    0 0 0
    1 1
    1
    样例输出 Sample Output

       

    1 3 4 5
    27
    数据范围及提示 Data Size & Hint

    (N<=20)

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int di[30];
     5 int map[30][30];
     6 int pre[30];  //前驱 
     7 int f[30];
     8 int n,m,maxn,ans,w,c;
     9 bool flag; 
    10 void print(int a)  //输出 
    11 {
    12     if(!a)return ;
    13     print(pre[a]);
    14     cout<<a<<" ";
    15 }
    16 int main()
    17 {
    18     cin>>n;
    19     for(int i=1;i<=n;++i)cin>>di[i];
    20     for(int i=1;i<n;++i)
    21         for(int j=i+1;j<=n;++j)
    22         {
    23             cin>>m;
    24             if(m==1)
    25             {
    26                 map[j][i]=1;flag=1;
    27             }
    28         }
    29     if(!flag)  //特判 
    30     {
    31         for(int i=1;i<=n;++i)
    32         {
    33             if(di[i]>=ans)  //等号不能少 
    34             {
    35                 ans=di[i];
    36                 c=i;
    37             }
    38         }
    39         cout<<c<<endl<<ans;
    40         return 0;
    41     }
    42     f[1]=di[1];
    43     for(int i=2;i<=n;++i)
    44     {
    45         maxn=0;
    46         for(int j=1;j<=i;++j)
    47         {
    48             if(f[j]>maxn&&map[i][j])
    49             {
    50                 maxn=f[j];
    51                 f[i]=f[j]+di[i];
    52                 c=j;
    53             }
    54         }
    55         pre[i]=c;
    56         if(f[i]>ans)
    57         {
    58             ans=f[i];
    59             w=i;
    60         }
    61     }
    62     print(w);
    63     cout<<endl<<ans;
    64     return 0;
    65 } 
  • 相关阅读:
    转】Apache解决高并发和高可用
    Kafka学习(一)配置及简单命令使用
    unity3d教程动态创建简单平面地形
    LeetCode: Unique Binary Search Trees [095]
    德惠也有星巴克
    一个css和js结合的下拉菜单,支持主流浏览器
    【图像处理】人类视觉成像原理
    windows使用nginx+memcached实现负载均衡和session或者缓存共享
    OpenCV基础篇之画图及RNG随机数对象
    在阿里云上布置git server
  • 原文地址:https://www.cnblogs.com/mjtcn/p/6764212.html
Copyright © 2020-2023  润新知