您的位置:首页 > 其它

SSL P2549 分数

2018-03-28 15:41 316 查看
目录:

题目

题意

分析

思路

代码

题目:

分数 题目

题意:

给出我们做每道题目所需的时间以及其难度,现在让我们求出在最优方案下,所能得到的分数是多少

分析:

这道题,很容易让人联想到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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  分数 01背包 数论