링크 :
https://codeforces.com/contest/1216/problem/B
질문의 의미 :
최근 Vasya 그의 권총 사격 능력을 향상하기로 결정했다. 오늘 팀의 코치는 그에게 다음과 같은 운동을 제안했다. 그는 테이블에 행에 n 개의 캔을 두었다. 캔은 1부터 n까지 좌측에서 우측으로 번호가 매겨져. Vasya는 운동을 마무리 정확히 한 번만 아래로 각이 할 수있는 노크한다. 그는 그가 캔을 허물고되는 순서를 선택할 수있다.
Vasya는 i 번째 캔의 내구성 인공 지능 것을 알고있다. 그것은 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;
}