UVA11400照明系统设计&& POJ1260Peals(DP)
紫书P275: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=105116#problem/A
POJ http://poj.org/problem?id=1260
两个题一种类型:
UVA11400 : n个灯泡可以选择,每个灯泡有四个属性,v需要电压,k电源费用,c每个灯泡的费用和所需灯泡的数量L,每种类型的灯泡必须配一种类型的电源费用,低电压可以选择换用高电压的灯泡,计算最小费用
首先不能跨电压(1和3, 2),之前一直想不明白,其实可以这么想,1,2,3,电压是递增的,如果1和3在一起,为什么1选择3,不选择2呢?
(1)假设2和3电源费用是相同的,而3的灯泡比2的便宜,所以1选择3会有最小费用,既然如此,2也得选择3才有最优解
(2)假设2和3灯泡的价值是一样的,而3的电源费用比较低,所以1选3,同样,2选3才会有会有最优解
所以不会跨电压!
s[i]表示前i种灯泡的数量,dp[i]前i种灯泡的最小费用,dp[i] = min(dp[j] + (sum[i] - sum[j]) * c[i] + k[i]) 0 <= j < i 表示前j个用最优策略买,后面的以i的价格买
POJ 1260:珍珠的数量a和价格p,每买一种需要多买10个,低等的可以高价买,一样的意思, dp[i] = min(dp[j] + (sum[i]- sum[j] + 10) * p[i])
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int MAX = + ;
const int INF = 0x3f3f3f3f;
struct Lamp
{
int v,k,c,l;
};
Lamp lamp[MAX];
int sum[MAX],dp[MAX];
int cmp(Lamp x, Lamp y)
{
return x.v < y.v;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF && n)
{
for(int i = ; i <= n; i++)
{
scanf("%d%d%d%d", &lamp[i].v, &lamp[i].k, &lamp[i].c, &lamp[i].l);
}
sort(lamp + , lamp + n + , cmp);
memset(sum, , sizeof(sum));
memset(dp, , sizeof(dp));
sum[] = lamp[].l;
for(int i = ; i <= n; i++)
sum[i] = sum[i - ] + lamp[i].l;
dp[] = lamp[].c * lamp[].l + lamp[].k;
for(int i = ; i <= n; i++)
{
int minn = INF;
for(int j = ; j < i; j++)
{
minn = min(minn, dp[j] + (sum[i] - sum[j]) * lamp[i].c + lamp[i].k);
}
dp[i] = minn;
}
printf("%d\n", dp[n]);
}
return ;
}
UVA11400
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = + ;
struct Peal
{
int a,p;
};
Peal peal[N];
int c,dp[N],sum[N];
int cmp(Peal x, Peal y)
{
return x.p < y.p;
}
int main()
{
int test;
scanf("%d", &test);
while(test--)
{
scanf("%d", &c);
for(int i = ; i <= c; i++)
{
scanf("%d%d", &peal[i].a, &peal[i].p);
}
//sort(peal + 1, peal + c + 1, cmp); 加排序就WA
memset(sum, , sizeof(sum));
memset(dp, , sizeof(dp));
for(int i = ; i <= c; i++)
{
sum[i] = sum[i - ] + peal[i].a;
}
dp[] = ( peal[].a + ) * peal[].p;
for(int i = ; i <= c; i++)
{
int minn = INF;
for(int j = ; j < i; j++)
{
minn = min(minn, dp[j] + (sum[i] - sum[j] + ) * peal[i].p);
}
dp[i] = minn;
}
printf("%d\n", dp[c]);
}
return ;
}
poj1260
UVA11400照明系统设计&& POJ1260Peals(DP)的更多相关文章
- 【UVA】11400 照明系统设计 排序+dp
题目中有一个重要的信息是:每一种灯泡只能换成比它电压更大的灯泡,因此电压的大小限制了状态的转移.因此,在这里按照电压从小到大把每种灯泡排序,使得在考虑后面的灯泡时,前面的灯泡自然可以换成后面的灯泡.状 ...
- UVA - 11400 Lighting System Design(照明系统设计)(dp)
题意:共有n种(n<=1000)种灯泡,每种灯泡用4个数值表示.电压V(V<=132000),电源费用K(K<=1000),每个灯泡的费用C(C<=10)和所需灯泡的数量L(1 ...
- UVa 11400 照明系统设计
https://vjudge.net/problem/UVA-11400 题意: 有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯 ...
- Uva 11400,照明系统设计
题目链接:https://uva.onlinejudge.org/external/114/11400.pdf 题意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要 ...
- UVA 11400 Lighting System Design 照明系统设计
首先是一个贪心,一种灯泡要么全都换,要么全都不换. 先排序,定义状态d[i]为前面i种灯泡的最小花费,状态转移就是从d[j],j<i,加上 i前面的j+1到i-1种灯泡换成i的花费. 下标排序玩 ...
- UVa 11400 Lighting System Design(DP 照明设计)
意甲冠军 地方照明系统设计 总共需要n不同类型的灯泡 然后进入 每个灯电压v 相应电压电源的价格k 每一个灯泡的价格c 须要这样的灯泡的数量l 电压低的灯泡能够用电压高的灯泡替换 ...
- 近期做的一些DP
UVa 1625 color length https://blog.csdn.net/Dylan_Frank/article/details/52261424 https://www.cnblogs ...
- UVA11400 Lighting System Design(DP)
You are given the task to design a lighting system for a huge conference hall. After doing a lot of ...
- 【神仙DP】【UVa11400】Lighting System Design
传送门 Description Translation 题目大意:有一个照明系统需要用到n种灯,每种灯的电压为V,电源费用K,每个灯泡费用为C,需要该灯的数量为L.注意到,电压相同的灯泡只需要共享一个 ...
随机推荐
- CSS padding margin border属性
主要定义四个区域:内容(content).内边距(padding).边框(border)和外边距(margin) margin:层的边框以外留的空白 background-color:背景颜色 bac ...
- iOS打包导出时出现Missing iOS Distribution signing
iOS打包导出时出现Missing iOS Distribution signing 上传APP就出现Missing iOS Distribution signing indetity for 打包i ...
- Android应用程序窗口(Activity)的窗口对象(Window)的创建过程分析(转)
在前文中,我们分析了Android应用程序窗口的运行上下文环境的创建过程.由此可知,每一个Activity组件都有一个关联的ContextImpl对象,同时,它还关联有一个Window对象,用来描述一 ...
- mousewheel 模拟滚动
div{ box-sizing:border-box; } .father{ width:500px; height:400px; margin:auto; margin-top: 50px; bor ...
- C语言 百炼成钢3
//题目7:用*号输出空心菱形图案 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- C语言 百炼成钢8
//题目22:两个乒乓球队进行比赛,各出三人.甲队为a,b,c三人,乙队为x,y,z三人.已抽签决定 //比赛名单.有人向队员打听比赛的名单.a说他不和x比,c说他不和x, z比,请编程序找出 //三 ...
- Redmine 项目管理工具----完全攻略
摘要: 此篇博客涉及 安装,插件修改,插件安装,代码显示,中文乱码,SVN配置等内容,几乎覆盖所有redmine基本功能. 本机环境: Redmine 版本: 3.2.0 本机环境: win7 64位 ...
- java中从1970-1-1到当前时间之间的毫秒数转换为oracle date
java中System.currentTimeMillis()取到的是从1970-01-01 00:00:00.000到当前时间的毫秒数,一个long类型的值. 现在oracle数据库中某表中存取的是 ...
- js计算两个日期相隔几小时几分钟?
var dt1 = "2009-11-5 10:30" var dt2 = "2009-11-8 9:20" function ge ...
- Android 自定义NumProgressBar
这是GitHub上的一个开源控件,由于作者是用Android Studio开发,直接导入Eclipse不能使用,这边抠出来这个功能,做成一个小Demo,供Eclipse平台使用. style配置文件中 ...