UVA 11400

/*
题意翻译
题意: 给定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);
	}
} 
发布了37 篇原创文章 · 获赞 0 · 访问量 358

猜你喜欢

转载自blog.csdn.net/weixin_43191153/article/details/104426410