Course Selection System ZOJ - 3956

题意:

here are n courses in the course selection system of Marjar University. The i-th course is described by two values: happiness Hi and credit Ci. If a student selects m courses x1x2, ..., xm, then his comfort level of the semester can be defined as follows:

$$(\sum_{i=1}^{m} H_{x_i})^2-(\sum_{i=1}^{m} H_{x_i})\times(\sum_{i=1}^{m} C_{x_i})-(\sum_{i=1}^{m} C_{x_i})^2$$

Edward, a student in Marjar University, wants to select some courses (also he can select no courses, then his comfort level is 0) to maximize his comfort level. Can you help him?

思路:这个题在秋天区域赛选拔赛的时候见过,这是第二次遇到这个题了,区域赛选拔赛的时候对这个题没什么思路,大概是赛后看了题解又觉得这个题太水了,没好好思考导致第二次遇到这个题竟然忘记怎么做了,到了最后的时刻还是队友突然想起来是一个背包,然后ac了。

本来以为是一个贪心,但是并没有找到什么贪心的策略,通过观察这个式子和数据范围我们会发现,c的值都很小,所以问题就可以转化为在相同c的取值下,能够取到的最大的h的和是多少,这样我们就可以很容易的想到背包了。

#include <iostream>
#include <bits/stdc++.h>

using namespace std;
const int maxn=50050;
long long  int dp[maxn];
int n;
struct Node
{
    int h,c;
} node[maxn];
long long int dig(long long int h,long long  int c)
{
    return h*h-h*c-c*c;
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        int m=0;
        for(int i=0; i<n; i++)
        {
            scanf("%d%d",&node[i].h,&node[i].c);
            m+=node[i].c;
        }
        memset(dp,0,sizeof(dp));
        for(int i=0; i<n; i++)
        {
            for(int j=m; j>=0; j--)
            {
                if(j>=node[i].c)
                {
                    dp[j]=max(dp[j],dp[j-node[i].c]+node[i].h);
                }
            }
        }
        long long   int ans=0;
        for(int i=0; i<=m; i++)
        {
            ans=max(ans,dig(dp[i],i));
        }
        cout<<ans<<endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值