Shooting 题解
第9次了……
题意
有 $n$ 个罐子,每一个罐子有耐久度 $a_i$,设已经打掉的罐子数量为 $x$,则射击罐子所消耗的射击数是 $x_i\times x+1$,问打掉所有罐子所消耗的最少枪数。
思路
通过题目描述可以很明显的看出随着时间的推移越往后打罐子所需的枪数就越少,所以一个显而易见的贪心思路就出现了,可以优先打掉耐久度更高的罐子,这样就可以在耐久度高的罐子上花费更少的枪数。
可是这道题还有一个问题,就是还要输出打罐子的编号,可是如果要优先打耐久度更高的罐子就免不了要排序,所以可以考虑用结构体来排序。
AC Code
#include<bits/stdc++.h>
using namespace std;
struct node{
int t,val;
}a[1005];//val记录每个罐子的耐久度
bool cmp(node x,node y){
return x.val>y.val;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].val;
a[i].t=i;//用t来记录罐子的编号,这样排序后编号也不会乱
}
sort(a+1,a+n+1,cmp);//结构体排序
int x=0,sum=0;//x用来记录打掉了几个罐子,sum记录枪数
for(int i=1;i<=n;i++){
sum+=a[i].val*x+1;//sum记录枪数
x++;//模拟罐子被打掉
}
cout<<sum<<endl;
for(int i=1;i<=n;i++){
cout<<a[i].t<<" ";//直接输出编号就可以了
}
return 0;
}