博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Course Selection System ZOJ - 3956
阅读量:4114 次
发布时间:2019-05-25

本文共 1335 字,大约阅读时间需要 4 分钟。

题意:

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 
#include
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
=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<
<

转载地址:http://fbgsi.baihongyu.com/

你可能感兴趣的文章
js-高德地图规划路线
查看>>
常用js收集
查看>>
mydata97的日期控件
查看>>
如何防止sql注入
查看>>
maven多工程构建与打包
查看>>
springmvc传值
查看>>
Java 集合学习一 HashSet
查看>>
在Eclipse中查看Android源码
查看>>
Android-Socket登录实例
查看>>
Android使用webservice客户端实例
查看>>
层在页面中的定位
查看>>
[转]C语言printf
查看>>
C 语言 学习---获取文本框内容及字符串拼接
查看>>
C 语言学习 --设置文本框内容及进制转换
查看>>
C 语言 学习---判断文本框取得的数是否是整数
查看>>
C 语言 学习---ComboBox相关、简单计算器
查看>>
C 语言 学习---ComboBox相关、简易“假”管理系统
查看>>
C 语言 学习---回调、时间定时更新程序
查看>>
C 语言 学习---复选框及列表框的使用
查看>>
第四章 - 程序计数器
查看>>