CF1216B.Shooting

入门

通过率:0%

AC君温馨提醒

该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。

题目描述

最近,Vasya 决定提升自己的手枪射击技能。今天他的教练给他布置了如下练习:他在桌子上按顺序摆放了 nn 个易拉罐,编号从左到右依次为 11 到 nn。Vasya 需要将每个易拉罐恰好击倒一次,才能完成练习。他可以自由选择击倒易拉罐的顺序。

Vasya 知道第 ii 个易拉罐的耐久度为 aia_i。这意味着,如果 Vasya 已经击倒了 xx 个易拉罐,现在准备开始射击第 ii 个易拉罐,他需要用 (ai⋅x+1)(a_i \cdot x + 1) 次射击才能将其击倒。你可以假设 Vasya 一旦开始射击某个易拉罐,就会一直射击直到将其击倒。

你的任务是选择一种击倒易拉罐的顺序,使得击倒所有 nn 个易拉罐所需的总射击次数最少。

输入格式

输入的第一行包含一个整数 nn,表示易拉罐的数量,2≤n≤10002 \le n \le 1000。

第二行包含 a1,a2,…,ana_1, a_2, \dots, a_n,其中 aia_i 表示第 ii 个易拉罐的耐久度,1≤ai≤10001 \le a_i \le 1000。

输出格式

第一行输出击倒所有 nn 个易拉罐所需的最少射击次数。

第二行输出 nn 个互不相同的整数,表示最优的击倒顺序(即易拉罐的编号)。如果有多种最优方案,可以输出任意一种。

输入输出样例

  • 输入#1

    3
    20 10 20

    输出#1

    43
    1 3 2
  • 输入#2

    4
    10 10 10 10

    输出#2

    64
    2 1 4 3
  • 输入#3

    6
    5 4 5 4 4 5

    输出#3

    69
    6 1 3 5 2 4
  • 输入#4

    2
    1 4

    输出#4

    3
    2 1

说明/提示

在第一个样例中,Vasya 可以先击倒第一个易拉罐。由于之前没有击倒任何易拉罐,他只需射击 11 次即可击倒它。之后,他可以击倒第三个易拉罐,需要射击 20⋅1+1=2120 \cdot 1 + 1 = 21 次。最后只剩下第二个易拉罐,需要射击 10⋅2+1=2110 \cdot 2 + 1 = 21 次。因此总共需要 1+21+21=431 + 21 + 21 = 43 次射击。

在第二个样例中,由于所有易拉罐的耐久度相同,击倒顺序不会影响总射击次数。

由 ChatGPT 4.1 翻译

输入解题思路,AI测评打分。不知道怎么写?

首页