题目简述

给定比赛时间T和n个题目,你可以在任意时间提交题目,每个题目有一个初始分数maxPoints[i],每个单位时间题目的分数将会减少pointsPerMinute[i],即如果在时间t解决了第i个题目,那么获得的分数为maxPoints[i] - t * pointsPerMinute[i],另外做每个题目需要requiredTime[i]的时间,求能够获得的最大分数是多少?

题解

由于问题解决的先后,获得的分数是不一样的,因为我们首先得确定做题的选择顺序,根据相邻交换法,对于问题a和问题b,如果requiredTime[b]*pointsPerMinute[a]>requiredTime[a]*pointsPerMinute[b],先解决a再解决b获得的分数会比先b后a多,所以我们可以先根据这个条件对题目进行排序,之后就是01背包问题了

代码:

 struct node
{
int mp, pp, rt;
};
node a[];
int dp[];
bool cmp(node a, node b)
{
return (LL)b.rt * a.pp > (LL)a.rt * b.pp;
}
class TheProgrammingContestDivOne
{
public:
LL find(int T, vector <int> maxPoints, vector <int> pointsPerMinute, vector <int> requiredTime)
{
int n = maxPoints.size();
for (int i = ; i < n; i++)
{
a[i + ].mp = maxPoints[i];
a[i + ].pp = pointsPerMinute[i];
a[i + ].rt = requiredTime[i];
}
sort(a + , a + n + , cmp);
memset(dp, , sizeof(dp));
for (int i = ; i <= n; i++)
for (int j = T; j >= a[i].rt; j--)
if (a[i].mp - (LL)a[i].pp * j >=)
dp[j] = max(dp[j], dp[j - a[i].rt] + a[i].mp - a[i].pp * j);
int ans = ;
for (int i = ; i <= T; i++) ans = max(ans, dp[i]);
return ans;
}
};

SRM 502 DIV1 500pt(DP)的更多相关文章

  1. SRM 514 DIV1 500pt(DP)

    题目简述 给定一个H×W大小的矩阵,每个格子要么是1~9中的一个数,要么是".",要求你把“.”填成具体的数字(1~9),并且符合以下两个要求: 对于所有的整数r 和 c( 0 & ...

  2. SRM 511 DIV1 500pt(DP)

    题目简述 给定n个数,两个人轮流取数,和之前两个人的取的数或起来,谁不能取数或者谁取到的数和之前的数或值为511谁输,问谁能够赢? 题解 刚开始的想法是直接搜,不过需要记录取过的值的状态,2^50显然 ...

  3. SRM 508 DIV1 500pt(DP)

    题目简述 给定一个大小为 n的序列(n<=10)R,要求你计算序列A0, A1, ..., AN-1的数量,要求A序列满足A0 + A1 + ... + AN-1 = A0 | A1 | ... ...

  4. SRM 509 DIV1 500pt(DP)

    题目简述 给定一个字符串,可以对其进行修改,删除,增加操作,相应的操作有对应的花费,要求你用最小的花费把字符串变为回文串 题目做法 先搞一遍floyed把各种操作的最小花费求出来,然后就是类似编辑距离 ...

  5. SRM 501 DIV1 500pt(DP)

    题目简述 给定一个长度为n的序列,每个数值的范围为[-1,40],-1可以替换成0~40之间的数,要求你求出符合以下条件的序列有多少个? 1.每个数都是0~40之间的数 2.对于每一个数A[i],都需 ...

  6. SRM DIV1 500pt DP

    SRM 501 DIV1 500pt SRM 502 DIV1 500pt SRM 508 DIV1 500pt SRM 509 DIV1 500pt SRM 511 DIV1 500pt SRM 5 ...

  7. SRM 358(1-250,500pt)

    DIV1 250pt 题意:电视目前停留在第100台,有一个遥控器,可以向上或向下换台(需要按键一次),也可以按一些数字,然后直接跳到该台(需要按键次数等于数字数,不需要按确定键).但是,这个遥控一些 ...

  8. SRM 601(1-250pt,500pt)

    DIV1 250pt 题意:有很多袋子,里面装有苹果和橘子(也可能没有),给出每个袋子里有多少个苹果,多少个橘子.如果每个袋子里含有水果的总数都不小于x个,则可以从每个袋子里都拿出x个水果(拿出苹果和 ...

  9. Topcoder SRM 643 Div1 250<peter_pan>

    Topcoder SRM 643 Div1 250 Problem 给一个整数N,再给一个vector<long long>v; N可以表示成若干个素数的乘积,N=p0*p1*p2*... ...

随机推荐

  1. C++:类的创建

    类的创建 #include<iostream> #include<cmath> using namespace std; class Complex //声明一个名为Compl ...

  2. 利用 img 和 script 发送跨域请求

    利用img.src可以发送http请求,但是发送http请求不是img.src的真正用意. 同样,用script.src去请求jsonp格式的接口数据也不是script元素的最初设计用途. 但是这些歪 ...

  3. 使用 GIT 获得Linux Kernel的代码并查看,追踪历史记录

    Linux kernel  的官方 GIT地址是: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git 可以从这个地 ...

  4. How to Determine the Version of Oracle XML Publisher for Oracle E-Business Suite 11i and Release 12 (Doc ID 362496.1)

    Modified: 29-Mar-2014 Type: HOWTO In this DocumentGoal   Solution   1. Based upon an output file gen ...

  5. BZOJ2111: [ZJOI2010]Perm 排列计数

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意:一个1,2,...,N的排列P1,P2...,Pn是Magic的,当且仅当2< ...

  6. GridView CommandArgument 绑定多个参数

    我们在使用GridView的时候 有时会需要绑定多个参数 <asp:GridView ID="gvwVoxListAll" runat="server"  ...

  7. html5客户端跨域访问php服务端数据

    客户端代码: var param = $.param( { feed:JSON.stringify({ content:'abcd' }) } ); $http({ url: 'http://61.1 ...

  8. 02day2

    油滴扩展 [问题描述] 在一个长方形框子里,最多有 N(0≤N≤6)个相异的点.在其中任何-个点上放一个很小的油滴,那么这个油滴会一直扩展,直到接触到其他油滴或者框子的边界.必须等一个油滴扩展完毕才能 ...

  9. ffmpeg显示视频

    项目最近需要实现播放视频功能,这个在上家公司就做过.虽然跟之前的场景不一样,有以前的功底还是很快可以解决,事实也确实如此.在使用DShow处理完视频分割与合并后,继续使用DShow显示视频,很快即完成 ...

  10. 【大数模板】C++大数类 大数模板

    分别使用C++中的运算符重载的方法来实现大数之间的数学运算,包括加法.减法.乘法.除法.n次方.取模.大小比较.赋值以及输入流.输出流的重载. 感觉很麻烦... [代码] #include<io ...