🍎题解:
带入情景,我们可以发现,接水时间短的人先接水可以最大限度缩短整体的接水时间,我们只需要对数组排个序,就可以得到花费时间最短的排列;平均花费的时间只需要队列对应位置的值乘以相对的权重除以人数即可
🍑AC代码
#include<iostream>
#include<algorithm>
using namespace std;
typedef struct node{
int id;
int t;
};
const int maxn=1000+10;
node p[maxn];
bool cmp(node a,node b){
return a.t<b.t;
}
int main(){
int n;
cin>>n;
long long sum=0;
for(int i=1;i<=n;i++){
p[i].id=i;
std::cin>>p[i].t;
}
std::sort(p+1,p+n+1,cmp);
for(int i=1;i<=n;i++){
std::cout<<p[i].id<<' ';
}
int tmp;
for(int i=1;i<=n;i++){
tmp=p[i].t*(n-i);
sum+=tmp;
}
std::cout<<std::endl;
printf("%.2f",1.0*sum/n);
}
🍉题解:
我们可以发现,最大的跳跃距离是从高度最大的地方跳到高度最小的地方,再跳到高度次大地方,再跳到高度次小的地方…以此类推,那么,代码就很好写了,我们对高度进行排序,用两个指针分别指向首尾,依次计算距离相加就可以得到答案
⭐️ AC代码:
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
cin>>n;
int p[n];
for(int i=0;i<n;i++){
cin>>p[i];
}
sort(p,p+n);
long long sum;
int i=0,j=n-1;
sum=p[j]*p[j];
while(i<j){
if(i<j){
sum+=(p[j]-p[i])*(p[j]-p[i]);
j--;
}
if(i<j){
sum+=(p[j]-p[i])*(p[j]-p[i]);
i++;
}
}
cout<<sum;
}