【模拟题】陈老师搬书

 

 

题目描述

陈老师喜欢网购书籍,经常一次购它个百八十本,然后拿来倒卖,牟取暴利。前些天,高一
的新同学来了,他便像往常一样,兜售他的书,经过一番口舌,同学们决定买他的书,但是 CS
桌上的书有三堆,每一堆都有厚厚的一叠,他要想个办法用最轻松的方式把书拿下来给同学
们.但是你想逗一下 CS, 于是,请你设计一个最累的方式给他.
若告诉你这三堆分别有 i,j,k 本书,以及每堆从下到上书的重量.每次取书只能从任意
一堆的最上面取,那么请你帮助他设计一个方案,让他花最大的力气取下所有书(CS 别打
我).
显然,每次取书,陈老师的体力消耗都会加大,这里用体力系数代表,取下第一本书时,体
力系数为 1,第二本时为 2,依次类推,而每次体力消耗值则为体力系数和书的重量之积。
举个例子:
三堆书及重量如下

不用证明,最累的取书方式为: 右左左中, 即: 3*1+9*2+2*3+10*4=3+18+6+40=67
 

输入

输入文件的第一行为 3 个数,分别为三堆数量 I,j,k
第二行至第四行分别为每堆由下至上的书本重量

输出

输出最累方式的体力消耗总值即可
 

样例输入

3 2 4
2 3 2
1 5
9 8 7 4

样例输出

257
 

数据范围限制

对于 40%的数据有:0<=i<10 0<=j<10 0<=k<10
对于 100%的数据有:0<=i<100 0<=j<100 0<=k<100
最后输出的体力消耗总值在 longint 范围内
 

提示

输入数据为每堆由下至上的书本重量!

 

错误代码

#include<bits/stdc++.h>
using namespace std;
const int inf = 2147483647;
int i,j,k;
long long ans;
int stki[102],stkj[102],stkk[102];
int mintop(int a,int b,int c)
{
    if(a < b)
    {
        if(a < c) return 1;
        else return 3;
    }
    else
    {
        if(a < c) return 2;
        else
        {
            if(b > c) return 3;
            else return 2;
        }
    }
}
int main()
{
    int t,m,topi,topj,topk;
    cin >> i >> j >> k;
    for( t = 0 ; t < i ; t++ )
    {
        cin >> m;
        stki[t] = m;
    }
    topi = t-1;
    for( t = 0 ; t < j ; t++ )
    {
        cin >> m;
        stkj[t] = m;
    }
    topj = t-1;
    for( t = 0 ; t < k ; t++ )
    {
        cin >> m;
        stkk[t] = m;
    }
    topk = t-1;
    t = 1;
    while(stki[topi] || stkj[topj] || stkk[topk])
    {
        int a = inf,b = inf,c = inf,d;
        if(topi >= 0) a = stki[topi];
        if(topj >= 0) b = stkj[topj];
        if(topk >= 0) c = stkk[topk];
        m =mintop(a,b,c);
        if(m == 1)
        {
            d = stki[topi];
            topi--;
        }
        if(m == 2)
        {
            d = stkj[topj];
            topj--;
        }
        if(m == 3)
        {
            d = stkk[topk];
            topk--;
        }
    
    /*    if(stki[topi] < stkj[topj] && stki[topi] && stkj[topj])
        {
            if(stki[topi] < stkk[topk])
            {
                m = stki[topi];
                topi--;
            }
            else
            {
                m = stkk[topk];
                topk--;
            }
        }
        else
        {
            if(stki[topi] < stkk[topk])
            {
                m = stkj[topj];
                topj--;
            }
            else
            {
                if(stkj[topj] < stkk[topk])
                {
                    m = stkj[topj];
                    topj--;
                }
                else
                {
                    m = stkk[topk];
                    topk--;
                }
            }
        }
        */
        ans += t*d;
        t++;
    }
    cout << ans;
    return 0;
}
   

 

 

实现代码:

 

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<stack> 
using namespace std;
long f[110][110][110];
int a1[110],a2[110],a3[110],k1,k2,k3,i,j,k;
int main()
{
    //freopen("book.in","r",stdin);
    //freopen("book.out","w",stdout); 
    scanf("%d%d%d",&k1,&k2,&k3);
    for(i=k1;i>0;--i) scanf("%d",&a1[i]);
    for(i=k2;i>0;--i) scanf("%d",&a2[i]);
    for(i=k3;i>0;--i) scanf("%d",&a3[i]);
    for(i=0;i<=k1;++i)
        for(j=0;j<=k2;++j)
            for(k=0;k<=k3;++k){
                if(i>=1) f[i][j][k]=max(f[i][j][k],f[i-1][j][k]+a1[i]*(i+j+k));
                if(j>=1) f[i][j][k]=max(f[i][j][k],f[i][j-1][k]+a2[j]*(i+j+k));
                if(k>=1) f[i][j][k]=max(f[i][j][k],f[i][j][k-1]+a3[k]*(i+j+k));
            }
    printf("%ld\n",f[k1][k2][k3]);
    return 0;
}

 

posted @ 2018-10-27 15:40  LizLiz  阅读(184)  评论(0)    收藏  举报