zoukankan      html  css  js  c++  java
  • zznu 2054 : 油田

    题目描述

    在太平洋的一片海域,发现了大量的油田!

    为了方便开采这些能源,人们将这些油田从1到n进行编号,

    人们在开采这些油田时,有三种开采方式,分别为方式A,方式B,方式C。

    用不同的方式去开采这些油田所消耗的资金不同,为了防止共振导致的油井坍塌,相邻编号的油田不能使用同一种开采方式。

    我们希望你求出开采这n个油田所需要消耗的最小资金,并输出开采每个油田所采用的方式。

    输入

    先输入一个整数T(0 < T <= 100),代表有T组测试数据。对于每组数据,第一行输入一个正整数n(n<1000)代表油田数目,

    接下来n行,每一行包含三个整数。第i(2 <= i <= n+1)行的这三个数代表着开采编号为i-1的油田分别采用A,B,C三种方式开采所消耗的资金。

    输出

    对于每一组测试样本,先输出样本编号,接下来输出一个整数,代表着开采这n个油田所需要消耗的最小资金,然后按编号从小到大的顺序输出开采每个油田所采用的方式。每一组测试样本的输出占一行。

    样例输入

    复制
    1
    2
    4 8 3
    2 1 4

    样例输出

    复制
    Case 1: 4 CB


    dp题, 但是还要保留路径,直接再多开一个数组最后迭代输出路径即可
     1 #include <stdio.h>
     2 #include <string.h>
     3 #include<algorithm>
     4 using namespace std;
     5 struct node
     6 {
     7     int x, y, z;
     8 }a[1005], b[1005];
     9 int ans[1005], sum, minn, n;
    10 void fact(int s)
    11 {
    12     int m=n;
    13     while(m)
    14     {
    15         if(s==1)
    16         {ans[m]= b[m].x;s=b[m].x;}
    17         else if(s==2)
    18             {ans[m]=b[m].y;s=b[m].y;}
    19         else
    20             {ans[m]= b[m].z;s=b[m].z;}
    21         m--;
    22     }
    23 }
    24 int main()
    25 {
    26     int t, tt=1;
    27     scanf("%d", &t);
    28     while(t--)
    29     {
    30         scanf("%d", &n);
    31         memset(a, 0, sizeof(a));
    32         for(int i=1; i<=n; i++)
    33             scanf("%d%d%d", &a[i].x, &a[i].y, &a[i].z);
    34         for(int i=1; i<n; i++)
    35         {
    36             a[i+1].x=a[i+1].x+min(a[i].y, a[i].z);
    37             if(a[i].y>a[i].z)
    38                 b[i].x=3;
    39                 else
    40                     b[i].x=2;
    41             a[i+1].y=a[i+1].y+min(a[i].x, a[i].z);
    42             if(a[i].x>a[i].z)
    43                 b[i].y=3;
    44             else
    45                 b[i].y=1;
    46             a[i+1].z=a[i+1].z+min(a[i].x, a[i].y);
    47             if(a[i].x>a[i].y)
    48                 b[i].z=2;
    49             else
    50                 b[i].z=1;
    51         }
    52         minn=min(min(a[n].x, a[n].y), a[n].z);
    53         printf("Case %d: %d ",tt++, minn);
    54         if(minn==a[n].x)
    55         {b[n].x=1;fact(1);}
    56         else if(minn==a[n].y)
    57             {b[n].y=2;fact(2);}
    58         else
    59             {b[n].z=3;fact(3);}
    60         for(int i=1; i<=n; i++)
    61             printf("%c", ans[i]+'A'-1);
    62         printf("
    ");
    63     }
    64     return 0;
    65 }



  • 相关阅读:
    Redis从0到精通Redis持久化
    Redis从0到精通事务
    Redis从0到精通Nosql概述
    LAMP源码MySQL集群版搭建 枯木
    Apache mod_cband 流量控制 枯木
    MySQL簇概述 枯木
    RHEL6 sysbench libtool error 枯木
    shell脚本不换行刷新数据 枯木
    MySQLCluster 枯木
    MFS部署 枯木
  • 原文地址:https://www.cnblogs.com/zhulei2/p/7978123.html
Copyright © 2011-2022 走看看