E. 小迷妹在哪儿
Time limit per test: 2.0 seconds
Memory limit: 256 megabytes
ultmaster 男神和小迷妹们玩起了捉迷藏的游戏。
小迷妹们都希望自己被 ultmaster 男神发现,因此她们都把自己位置告诉了 ultmaster 男神,因此 ultmaster 男神知道了自己去找每个小迷妹所要花的时间。
已知发现第 i 小迷妹得到的分数为 ai⋅tr(tr 为游戏剩余时间)。ultmaster 想知道他最多能拿多少分。
Input
第一行两个整数 n,T(1≤n≤105,1≤T≤300) 分别表示小迷妹数量,游戏总时间。
接下去 n 行,每行两个整数 ai,ti(1≤ai≤100,1≤ti≤300) 分别表示发现小迷妹的分数以及 ultmaster 男神发现小迷妹所需时间。
Output
一个整数,表示 ultmaster 在游戏中最多拿多少分。
Examples
Input
2 10 2 5 1 6
Output
10
Input
3 5 5 4 1 1 10 6
Output
5
Note
样例一:找到小迷妹一,找到后得分 2×(10−5)=10 分。
样例二:找到小迷妹一,找到后得分 5×(5−4)=5 分,之后再找到小迷妹二得分也是 0,所以最高得分 5 分。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
int dp[maxn];
struct node
{
int d, t;
double f;
}a[maxn];
int cmp(node a, node b)
{
return a.d*b.t>a.t*b.d;
}
int main()
{
int n, t;
//freopen("in.txt","r",stdin);
while(~scanf("%d%d", &n, &t))
{
memset(dp, 0, sizeof(dp));
for(int i = 1; i <= n; i++)
scanf("%d%d", &a[i].d, &a[i].t);
//for(int i = 1; i <= n; i++)
//scanf("%d", &a[i].c), a[i].f = a[i].c*1.0 / a[i].d;
sort(a+1, a+1+n, cmp);
int maxx = 0;
for(int i = 1; i <= n; i++)
{
for(int v = t; v >= a[i].t; v--)
{
dp[v] = max(dp[v], dp[v-a[i].t]+a[i].d*(t-v));
maxx = max(dp[v], maxx);
}
}
printf("%d\n", maxx);
}
return 0;
}