D. Lift Problems(动态规划)

D. Lift Problems(动态规划)

借鉴:

https://blog.csdn.net/Wood_Du/article/details/80968277

    1000 ms

  • 262144k

在一座大型大学大楼的底层(零层),许多学生在等电梯。通常,电梯停在一个或多个学生需要下车的每一层楼,但对于想要在较高楼层下车的学生来说,这是很烦人的。或者,电梯可以跳过几层楼,但对于那些想在其中一层楼下车的学生来说,这是很烦人的。

具体来说,如果电梯还没有到达他或她想要下车的楼层,那么在电梯停下来的每一层,学生都会感到恼火。如果电梯跳过学生想要下车的楼层,他或她就会在那层和每一层都感到烦恼,直到(不包括)电梯下一站的地板,学生终于可以出来走下楼梯,回到自己的目的地。例如,如果一个学生想在第五层下车。当电梯停在二楼、七楼和十楼时,学生会在二楼、五楼和六楼感到厌烦。总之,这位学生在三层楼会感到烦恼。

进入电梯后,每个学生都按下与他或她想要去的楼层相对应的按钮,即使它已经被别人按下了。控制电梯的CPU可以准确地知道每个楼层有多少学生想要下车。

您的任务是编程CPU,以决定在哪一层停止。我们的目标是最大限度地减少所有学生的愤怒情绪:也就是每个学生被激怒的楼层数,为所有学生加在一起。

你可以忽略所有可能(想)进入电梯的人在任何较高的楼层。电梯必须以这样的方式操作:每一个在一楼等候的学生都可以到她或他想要去的楼层,要么从那层楼出来,要么走下楼梯。

输入格式

在第一行中有一个阳性数字:测试用例的数量,最多为100个。在此之后,每个测试用例:

  • 一个整数的一行nn (1列克n\leq 1 5001n1500):建筑物的楼层数,不包括底层。
  • 带n个空分隔整数的一行S_isi (0\leq s_i\leq 1 5000si1500):每层楼ii,学生人数S_isi想出去的人。

输出格式

每个测试用例:

  • 一行有一个整数:最小的总数量的提升愤怒。

样例输入

3
5
0 3 0 0 7
5
0 0 3 0 7
10
3 1 4 1 5 9 2 6 5 3

样例输出

7
6
67

题目来源

BAPC 2014初步


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cstring>
#define maxn 1600
#define inf 0x3f3f3f3f
int T;
int n,s[maxn];
int dp[maxn];// 从一楼到i楼可以下楼情况时生气的最小值,每层楼都可以停留,所以之间的点都要算,因为是动态规划,所以每次只要算端点和其他任意点就行了。
             //
using namespace std
int main()
{
    cin>>T;
    int i,j,k;
    while(T--)
    {
        cin>>n;
        int sum=0;
        for(i=1;i<=n;i++)
        {
            cin>>s[i];
            sum+=s[i]; //sum为高层人数
        }
        dp[0]=0;
        for(i=1;i<=n;i++)
        {
            sum-=s[i];  //i以前的都会下,sum为i以上的,持续减小。
            k=0;
            dp[i]=inf;
            for(j=i-1;j>=0;j--)
            {
                dp[i]=min(dp[i],dp[j]+k+sum);  //dp[0]只是一个过渡变量,并没有dp本身的性质。dp[0]算的是在自身停的情况,也就是最后才算自身
                k=k+(i-j)*s[j];                //每次往下推一层就要在加上
            }
        }
        cout<<dp[n]<<endl;
    }
    return 0;
}

  • 1000 ms
  • 262144K

在一座大型大学大楼的底层(零层),许多学生在等电梯。通常,电梯停在一个或多个学生需要下车的每一层楼,但对于想要在较高楼层下车的学生来说,这是很烦人的。或者,电梯可以跳过几层楼,但对于那些想在其中一层楼下车的学生来说,这是很烦人的。

具体来说,如果电梯还没有到达他或她想要下车的楼层,那么在电梯停下来的每一层,学生都会感到恼火。如果电梯跳过学生想要下车的楼层,他或她就会在那层和每一层都感到烦恼,直到(不包括)电梯下一站的地板,学生终于可以出来走下楼梯,回到自己的目的地。例如,如果一个学生想在第五层下车。当电梯停在二楼、七楼和十楼时,学生会在二楼、五楼和六楼感到厌烦。总之,这位学生在三层楼会感到烦恼。

进入电梯后,每个学生都按下与他或她想要去的楼层相对应的按钮,即使它已经被别人按下了。控制电梯的CPU可以准确地知道每个楼层有多少学生想要下车。

您的任务是编程CPU,以决定在哪一层停止。我们的目标是最大限度地减少所有学生的愤怒情绪:也就是每个学生被激怒的楼层数,为所有学生加在一起。

你可以忽略所有可能(想)进入电梯的人在任何较高的楼层。电梯必须以这样的方式操作:每一个在一楼等候的学生都可以到她或他想要去的楼层,要么从那层楼出来,要么走下楼梯。

输入格式

在第一行中有一个阳性数字:测试用例的数量,最多为100个。在此之后,每个测试用例:

  • 一个整数的一行nn (1列克n\leq 1 5001n1500):建筑物的楼层数,不包括底层。
  • 带n个空分隔整数的一行S_isi (0\leq s_i\leq 1 5000si1500):每层楼ii,学生人数S_isi想出去的人。

输出格式

每个测试用例:

  • 一行有一个整数:最小的总数量的提升愤怒。

样例输入

3
5
0 3 0 0 7
5
0 0 3 0 7
10
3 1 4 1 5 9 2 6 5 3

样例输出

7
6
67

题目来源

BAPC 2014初步

猜你喜欢

转载自blog.csdn.net/xigongdali/article/details/80999098