您的位置:首页 > 其它

NYOJ 1070 诡异的电梯【Ⅰ】

2016-06-09 22:41 344 查看


诡异的电梯【Ⅰ】

时间限制:1000 ms  |  内存限制:65535 KB
难度:3

描述
新的宿舍楼有 N(1≤N≤100000) 层 and
M(1≤M≤100000)个学生. 在新的宿舍楼里, 为了节约学生的时间也为了鼓励学生锻炼身体, 所以规定该宿舍楼里的电梯在相邻的两层之间是不会连续停下(即,如果在第2层停下就不能在第3层停下。).所以,如果有学生在相邻的两层之间要停下, 则其中的一部分学生必须选择走楼梯来代替。规定:一个人走下一层楼梯的花费为A,走上一层楼梯的花费为B。(1≤A,B≤100)现在请你设计一个算法来计算出所有学生走楼梯花费的最小费用总和。 所有的学生一开始都在第一层,电梯不能往下走,在第二层的时候电梯可以停止。

输入输入有几组数据T。T(1≤T≤10)

每组数据有N (1≤N≤100000),M(1≤M≤100000),A,B(1≤A,B≤100)。

接下来有M个数字表示每个学生想要停的楼层。

输出输出看样例。
样例输入
1
3 2 1 1
2 3


样例输出
Case 1: 1


这题数据水不管改成A还是B都能过。。。

用了俩个dp数组没过,改成一个dp表示最优过了。。。一个数组要从n-2开始转移

#include <iostream>

#include <cstring>

#include <cstdio>

using namespace std;

const int N = 100011;

int dp
, x
;

const int inf=0x3f3f3f3f;

int main()

{

    int t, ncase=1;

    cin>>t;

    while(t--)

    {

        int n, m, a, b, c;

        scanf("%d %d %d %d", &n, &m, &a, &b);

        int mi=min(a, b);

        memset(dp,inf,sizeof(dp));

        memset(x,0,sizeof(x));

        while(m--)

        {

            scanf("%d", &c);

            x[c]++;

        }

        dp[1]=dp[2]=0;

        for(int i=3;i<=n;i++)

        {

            if(i!=n)

            {

                dp[i]=min(dp[i-1]+x[i]*mi,dp[i-2]+x[i-1]*mi);

            }

            else

            {

                dp[i]=min(dp[i-1]+x[i]*b,dp[i-2]+x[i-1]*mi);

            }

        }

        printf("Case %d: %d\n",ncase++,dp
);

    }

    return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: