/*
题意翻译
题意: 给定n(n≤1000)n(n≤1000) 种类型灯泡,
每个灯泡给出其电压v(v≤132000)v(v≤132000) ,
电源花费k(k≤1000)k(k≤1000) ,
每个灯的花费c(c≤10)c(c≤10) 和需求量l(1≤l≤100)l(1≤l≤100) 。
现在通过用电压大的灯泡替换某些电压小的灯泡来减小总花费,求最小的花费。
Translated by @UKE自动机
输入输出样例
输入 #1复制
3
220 400 7 18
120 600 8 16
100 500 10 20
0
输出 #1复制
778
*/
#include <stdio.h>
#include <string.h>
int min(int,int);
void swap(int[],int[]);
void paixu(int,int,int[][4]);
int main(void)
{
int n;
while(scanf("%d",&n) && n)
{
int sz[n+1][4],i,j,jl[n+1],mon[n+1];
memset(jl,0,sizeof(jl));
memset(mon,0,sizeof(mon));
for(i = 1;i <= n;i++)
{
scanf("%d%d%d%d",sz[i],sz[i]+1,sz[i]+2,sz[i]+3);
}
paixu(1,n,sz);
for(i = 1;i <= n;i++)
{
jl[i] = jl[i-1]+sz[i][3];
}
for(i = 1;i <= n;i++)
{
mon[i] = jl[i]*sz[i][2]+sz[i][1];
for(j = 1;j < i;j++)
{
mon[i] = min(mon[i],mon[j]+(jl[i]-jl[j])*sz[i][2]+sz[i][1]);
}
}
printf("%d\n",mon[n]);
}
return 0;
}
int min(int a,int b)
{
return a < b ? a:b;
}
void swap(int q[],int p[])
{
int i,t;
for(i = 0;i < 4;i++)
{
t = q[i];
q[i] = p[i];
p[i] = t;
}
}
void paixu(int t, int w,int sz[][4])
{
if(t < w)
{
int i = t,j = w,p = sz[t][0];
while(i < j)
{
while(i < j && sz[j][0] >= p)
{
j--;
}
swap(sz[i],sz[j]);
while(i < j && sz[i][0] <= p)
{
i++;
}
swap(sz[i],sz[j]);
}
paixu(t,i-1,sz);
paixu(i+1,w,sz);
}
}
UVA 11400
猜你喜欢
转载自blog.csdn.net/weixin_43191153/article/details/104426410
今日推荐
周排行