LightOJ

来源:互联网 发布:网络验证系统哪个好 编辑:程序博客网 时间:2024/06/15 15:21

题目描述:

点击打开链接

题意,你先要买n种灯,每种灯有自己的电压值v,电源费用k,单价c,需要的数量l,并且低电压的灯可以用高电压的灯替代,问所需的最小花费。由于存在低电压可以被高电压替代的规则,我们就可以从高电压开始枚举,枚举到低电压的时候就和高电压的比较,如果花费更少就选高电压的。

AC代码:

#include<iostream>#include<cstdio>#include<cstring>#include<string>#include<cmath>#include<stack>#include<vector>#include<queue>#include<algorithm>using namespace std;const int MAXM=305;const long long MOD=1000000007;const int INF=0x3f3f3f3f;const double PI=acos(-1);struct lit{    int v,k,c,l;};int dp[1010];int sum[1010];struct lit lt[1010];int n;bool cmp(lit l1,lit l2){    return l1.v>l2.v;}int main(){    int T;    scanf("%d",&T);    int cas=1;    while(T--)    {        scanf("%d",&n);        for (int i=1;i<=n;i++)            scanf("%d%d%d%d",<[i].v,<[i].k,<[i].c,<[i].l);        sort(lt+1,lt+1+n,cmp);        memset(sum,0,sizeof(sum));        for (int i=1;i<=n;i++)            sum[i]=sum[i-1]+lt[i].l;        dp[0]=0;        dp[1]=lt[1].k+lt[1].c*lt[1].l;        for (int i=2;i<=n;i++)        {            for (int j=i;j>=1;j--)            {                int tmp=sum[i]-sum[j-1];                if (j==i) dp[i]=dp[j-1]+tmp*lt[j].c+lt[j].k;                else dp[i]=min(dp[i],dp[j-1]+tmp*lt[j].c+lt[j].k);            }        }        int ans=dp[n];        printf("Case %d: %d\n",cas,ans);        cas++;    }    return 0;}