C1925 [Wannafly冬令营2018Day4]咆咆咆哮(简单版)(贪心)

在这里插入图片描述

思路:
想到了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;
}

发布了594 篇原创文章 · 获赞 16 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/tomjobs/article/details/103675465