SSL P2549 分数
2018-03-28 15:41
316 查看
目录:
题目
题意
分析
思路
代码
之所以要排序,是因为每个题有两个条件,而我们是不能只看其中一个的,所以求出比例(时间:难度)进而排序是非常明智的选择。至于用哪种排序,没有明确的要求,因为数据足够友善(^v^)。
值得注意的是,最大的分数不一定是在最后,我们应在01背包后所有的结果中,寻找最大值
2.求出比例,排序
3.使用01背包求最优方案
4.输出
题目
题意
分析
思路
代码
题目:
分数 题目题意:
给出我们做每道题目所需的时间以及其难度,现在让我们求出在最优方案下,所能得到的分数是多少分析:
这道题,很容易让人联想到01背包,但经过验算后,发现单一的01背包是肯定行不通的啦。思路呢,是没有问题的,只是我们需要在这个的基础上加个操作:排序。之所以要排序,是因为每个题有两个条件,而我们是不能只看其中一个的,所以求出比例(时间:难度)进而排序是非常明智的选择。至于用哪种排序,没有明确的要求,因为数据足够友善(^v^)。
值得注意的是,最大的分数不一定是在最后,我们应在01背包后所有的结果中,寻找最大值
思路:
1.输入2.求出比例,排序
3.使用01背包求最优方案
4.输出
代码:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define LL long long using namespace std; inline LL read() { LL d=0,f=1;char s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){d=d*10+s-'0';s=getchar();} return d*f; } int max(int x,int y) { return x>y? x:y; } struct node{ int a,b;double z; }x[3001]; bool cmp(node x,node y) { return x.z<y.z; } int f[10001]; int main() { /* freopen("score.in","r",stdin); freopen("score.out","w",stdout);*/ int n=read(),t=read(); int a,b,w=0; for(int i=1;i<=n;i++) { x[i].a=read();x[i].b=read(); x[i].z=(double)x[i].a/x[i].b;//求比例 } sort(x+1,x+n+1,cmp);//排序 for(int i=1;i<=n;i++)//标准01背包 for(int j=t;j>=x[i].a;j--) f[j]=max(f[j],f[j-x[i].a]+x[i].b*(t-j+x[i].a)); for(int i=1;i<=t;i++)//寻找最大值 w=max(w,f[i]); printf("%d",w); fclose(stdin); fclose(stdout); return 0; }
相关文章推荐
- SSL P2549 分数 题目
- 埃及分数问题 迭代加深搜索(IDDFS)
- cqyz#p1123分数问题·解题报告
- 字符统计/矩阵转置/分数求和
- 运算符重载简单应用之分数四则运算
- 【BZOJ2402】陶陶的难题II 分数规划+树链剖分+线段树+凸包
- 团队作业4分数发布
- [C/C++]OJ练习题:输出两个带分数的差[格式控制]
- 关于数据库根据分数排序的方式
- 团队作业6分数发布
- 输入分数,然后把分数转化为相应的等级
- Java数列求和:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13...求出这个数列的前20项之和。
- C语言实验——分数序列
- Problem E: 编写函数:分数的乘法 (Append Code)
- 算法学习:分数规划
- [bzoj4819][01分数规划][网络流-费用流]新生舞会
- 01分数规划专题
- poj Dropping tests 【二分】【分数规划】
- T1078 求分数序列和(#Ⅰ- 4 - 1)
- 分数加减法