思路:
想到了ec18年的拿到dp,想了个很假的状态。但是本题要是加攻击力的话,有后效性和前效性,所以不是好办法。
顺序不确定,所有可以确定每次选那些加攻击!因为只要确定了加攻击和直接攻击的数目,那么每个人攻击更优还是加攻击更优就已经确定了。每次再排序就ok啦(数据范围也保证能够n方)
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e3 + 7;
struct Node
{
ll x,y;
}p[maxn];
ll sumx[maxn],sumy[maxn];
int num;
int cmp(Node a,Node b)
{
return a.x - num * a.y > b.x - num * b.y;
}
int main()
{
int n;scanf("%d",&n);
for(int i = 1;i <= n;i++)
{
scanf("%lld%lld",&p[i].x,&p[i].y);
}
sort(p + 1,p + 1 + n,cmp);
for(int i = 1;i <= n;i++)
{
sumx[i] += sumx[i - 1] + p[i].x;
sumy[i] += sumy[i - 1] + p[i].y;
}
ll ans = 0;
for(int i = 1;i <= n;i++)
{
num = i;
sort(p + 1,p + 1 + n,cmp);
ll tmp = 0;
for(int j = i + 1;j <= n;j++)tmp += p[j].y * i;
for(int j = 1;j <= i;j++)tmp += p[j].x;
ans = max(ans,tmp);
}
printf("%lld\n",ans);
return 0;
}