1 条题解
-
0
C++ :
#include<iostream> using namespace std; int a[1005]; //每个人所需时间 //将过桥时间从小到大排序 void maopao(int a[],int n){ bool ok; //进行N-1轮排序 for(int i=n-1;i>=1;i--){ ok=true;//假设没有交换 //每轮进行i次排序 for(int j=0;j<i;j++){ //大的数往下沉 if(a[j]>a[j+1]){ //相互交换 C++自带函数 swap(a[j],a[j+1]); ok=false;//一旦发生过交换,标志设置成false,说明需要下一轮 } } //如果此轮没有发生过交换,说明数组已经排序完成 //无需下一轮比较跳出循环 if(ok==true) break; } } int main() { int n;//n个旅行家 int sum=0;//过桥用的总时间 cin>>n; //输入每个人的过桥时间 for(int i=0;i<n;i++) cin>>a[i]; //过桥时间排序 maopao(a,n); //如果超过4人 while(n >= 4) { //当方案1优于方案2 if((a[0]+a[n-2]) < (2*a[1])) { //将用时最长的2个人送到河对面 sum += a[n-1]; //用时最短和用时最长的一起过去 sum += a[0]; //用时最短的回来 sum += a[n-2]; //用时最短的和用时第二长的过去 sum += a[0]; //用时最短的回来 } else { //同样也是将用时最长的2个人送到河对面 sum += a[1]; // 最短和第二短的人过去 sum += a[0]; //最短的回来送手电 sum += a[n-1]; //最长的和第二长的过去 sum += a[1]; //第二短的回来 } //人数减少2人 :用时最长的2人已经被送过河了就不动他们了 n -= 2; } //如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ; if(n == 3) sum += a[1] + a[0] + a[2]; else if(n == 2) sum += a[1]; else sum += a[0]; cout<<sum<<endl; }
- 1
信息
- ID
- 2164
- 时间
- 1000ms
- 内存
- 16MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者