Ссылка:
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;
}