リンク:
https://codeforces.com/contest/1216/problem/B
質問の意味:
最近Vasyaは、彼のピストル射撃のスキルを向上させることにしました。今日、彼のコーチは彼に次の演習を提供しました。彼はテーブルの上に一列にN個の缶を置きました。缶は1からnまで左から右に番号が付けられています。Vasyaは、それぞれが正確に一度練習を終了することができますノックダウンする必要があります。彼は、彼は缶をノックダウンする順序を選択することが許可されています。
Vasyaは、i番目の缶の耐久性がAIであることを知っています。それはVasyaはすでにダウンのx缶をノックし、現在i番目のものを撮影を開始しようとしているしている場合、彼はそれをノックダウンする(ai⋅x+ 1)のショットが必要になることを意味します。彼はそれをノックダウンするまでは、Vasyaは、i番目の缶を撮影し始めた場合、彼はそれを撮影されると仮定することができます。
あなたの仕事は正確に一度のn与えられた缶のそれぞれをノックダウンするために必要なショット数が最小可能となるように、撮影のように順序を選択することです。
アイデア:
貪欲、大きな優先
コード:
#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;
}