【贪心】HDU-6546 Function

传送门

题目中有一个条件特别关键:1 ≤ a ≤ 1, 000

这说明二次函数全部开口向上。当x增大的时候,如果不能变得更小,只能变得更大。

所以把所有f(x=1)加入答案,取x=2下降最多的函数,同理取x=3,x=4…直到吧m用完为止

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 233;
typedef long long ll;
typedef pair<ll,ll> pii;
ll a[maxn], b[maxn], c[maxn];
set<pair<ll,pii> > st; // val, x, idx
int main()
{
    ll ans = 0;
    ll n, m; cin >> n >> m;
    for(int i = 1; i <= n; i++)
    {
        scanf("%lld%lld%lld", &a[i], &b[i], &c[i]);
        ans += a[i] + b[i] + c[i];
        st.insert({a[i] * 3 + b[i], {2, i}});
    }
    for(int i = 1; i <= m - n; i++)
    {
        auto t = *st.begin();
        ll x = t.second.first;
        int idx = t.second.second;
        ans += a[idx] * (2 * x - 1) + b[idx];
        st.erase(t);
        st.insert({a[idx] * (2 * x + 1) + b[idx],{x + 1, idx}});
    }
    cout << ans << endl;
}

发表评论

邮箱地址不会被公开。 必填项已用*标注