zznu 2054 : 油田
Posted 风子磊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("\n"); 63 } 64 return 0; 65 }
以上是关于zznu 2054 : 油田的主要内容,如果未能解决你的问题,请参考以下文章