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;
}
相关文章推荐
- 百度贴吧_爬虫
- 入门java script
- 安装RedHat教程
- 113. Path Sum II
- 使用RAII来管理对象资源
- 设计模式——设计模式之禅的阅读笔记
- Docker import error:Error: open /tmp/docker-import-123456789/repo/bin/json: no such file or directory
- 大型网站架构系列:分布式消息队列
- leetcode 17. Letter Combinations of a Phone Number
- String类部分函数详解
- ubuntu16LTS下现代五笔的使用
- C++ const
- 112. Path Sum
- 文件压缩与解压
- jQuery实现<textarea>高度自适应,适用于td中的textarea
- iOS 限制输入字数完美解决方案
- 111. Minimum Depth of Binary Tree
- Java序列化与反序列化
- 深入理解CSS中的定位(position)
- 一个关于JS作用域链的例子