Codeforces 라운드 # 587 (사업부. 3) B. 슈팅 (욕심)

링크 :

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;
}

추천

출처www.cnblogs.com/YDDDD/p/11622772.html