2025/5/16
第一题
A. 例题4.1.2 潜水
题目描述
在马其顿王国的ohide湖里举行了一次潜水比赛。
其中一个项目是从高山上跳下水,再潜水达到终点。
这是一个团体项目,一支队伍由n人组成。在潜水时必须使用氧气瓶,但是每只队伍只有一个氧气瓶。
最多两人同时使用一个氧气瓶,但此时两人必须同步游泳,因此两人达到终点的时间等于较慢的一个人单独游到终点所需要的时间。
好在大家都很友好,因此任何两个人后都愿意一起游水。安排一种潜水的策略,使得最后一名选手尽量早的达到终点。
输入格式
第一行:队伍的人数n(<=1000)。
下面是n行,每行1个数,分别是n个潜水所用的时间ti(<=1000)。
输出格式
1个整数,表示最少用的时间。
样例数据
input
31 3 4
Copy
output
8{4+1+3}氧气瓶还必须潜水送回来^-^
Copy
数据规模与约定
时间限制:1 \text {s}1s
空间限制:256 \text {MB}256MB
这道题一开始的时候,我想的是就是让最小值的那个人和每一个人依次来,去。
他是通过嗯但是通过思考其实可以发现,因为把如果把杨西平送到那边,那么那边还剩人数一定的,所以说呢我们其实可以让最大的和第二大的一起过去,然后呢再让一个小时过来。
代码如下,
#include<bits/stdc++.h>
using namespace std;
int n,sum,a[1010]={};
int main(){
freopen("D.in","r",stdin);
freopen("D.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+1+n);
while(n>=4)
{
int x1=a[1]*2+a[n]+a[n-1];
int x2=a[1]+a[2]*2+a[n];
sum+=min(x1,x2);
n-=2;
}
if(n==3)sum+=a[1]+a[2]+a[3];
else sum+=a[2];
cout<<sum;
return 0;
}