题目大意:给你n个数,让你找到一种排列方式,使得$\sum\limits_{i=1}^{n}a[i]*(b[i]-1)$($b$为$a$的一种排列)最小
应该可以一眼看出是贪心,因为大的放前面先射击一定更优
然后排序即可
代码如下:
#include<cstdio>
#include<algorithm>
using namespace std;
inline int read(){
int r=0,f=1;
char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9')r=(r<<1)+(r<<3)+c-'0',c=getchar();
return r*f;
}
struct Can{
int a,num;
}c[100001];
bool operator <(const Can &x,const Can &y){
return x.a>y.a;
}
int n,ans;
int main(){
n=read();
for(int i=1;i<=n;i++)
c[i]=(Can){read(),i};
sort(c+1,c+1+n);//按a[i]从大到小排序
for(int i=1;i<=n;i++)ans+=(i-1)*c[i].a+1;
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d ",c[i].num);
return 0;
}