Codeforces Round # 587 (Div. 3) B. Съемка (жадный)

Ссылка:

https://codeforces.com/contest/1216/problem/B

Значение вопросов:

Недавно Вася решил улучшить свои навыки стрельбы из пистолета. Сегодня его тренер предложил ему следующее упражнение. Он поместил п банок в ряд на столе. Стаканчики пронумерованы слева направо от 1 до п. Вася должен сбить каждый может ровно один раз, чтобы закончить упражнение. Ему разрешено выбирать порядок, в котором он будет стучать банки вниз.

Вася знает, что долговечность г-го банки является аи. Это означает, что если Вася уже стукнул х банки вниз и теперь собирается начать съемки I-го один, он будет нуждаться (ai⋅x + 1) выстрелов, чтобы сбить его. Можно предположить, что если Вася начинает стрелять г-го может, он будет снимать его, пока он не сбивает его.

Ваша задача состоит в том, чтобы выбрать такой порядок съемки, так что количество снимков, необходимых для постучать каждый из п дал банок вниз ровно один раз минимально возможным.

Идеи:

Жадный, большой приоритет

Код:

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e4+10;

struct Node
{
    int a, id;
    bool operator < (const Node& that) const
    {
        return this->a > that.a;
    }
}node[MAXN];
int n;

int main()
{
    cin >> n;
    for (int i = 1;i <= n;i++)
        cin >> node[i].a, node[i].id = i;
    sort(node+1, node+1+n);
    int cnt = 0, sum = 0;
    for (int i = 1;i <= n;i++)
    {
        sum += node[i].a*cnt+1;
        cnt++;
    }
    cout << sum << endl;
    for (int i = 1;i <= n;i++)
        cout << node[i].id << ' ' ;
    cout << endl;

    return 0;
}

рекомендация

отwww.cnblogs.com/YDDDD/p/11622772.html
рекомендация