标签:1700 int sum C语言 渡河 poj printf else 回来
贪心算法里经典的一个渡河问题
一艘船,每次只能过去两个人,两个人渡河的时间等于其中划船慢的那个人的时间
给你一批人和他们的划船时间,求最小全部渡河的时间
分析:
总人数n<=3时
n=1 t=t[1]
n=2 t=max(t[1],t[2]) 1和2中耗时长的那个
n=3 t=t[1]+t[2]+t[3] 1和3先去,1回来,再和2去
否则:考虑每次送两人过河(其中时间已经排好序了)
1. 1和n去,1回来,1和n-1去,1回来 n-=2 用时2*t[1]+t[n]+t[n-1]
2. 1和2去,1回来,n和n-1去,2回来 n-=2 用时t[1]+2*t[2]+t[n]
每次取两种方法的最小耗时,直到n<=3
AC代码:
#include <stdio.h>
#define N 1001
int t[N];
void Init(int n)
{
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
}
return ;
}
int max(int a,int b)
{
return a<b?b:a;
}
int min(int a,int b)
{
return a>b?b:a;
}
void quick_Sort(int array[],int left,int right)
{
int i=left,j=right,temp;
int pivot=array[(i+j)/2];
while (i<=j)
{
while(array[i]<pivot) i++;
while(array[j]>pivot) j--;
if (i<=j)
{
temp=array[i];
array[i]=array[j];
array[j]=temp;
i++;
j--;
}
}
if(i<right) quick_Sort(array,i,right);
if(left<j) quick_Sort(array,left,j);
}
int solve(int n)
{
int sum=0;
while (n>=4)
{
sum+=min(t[n]+2*t[2]+t[1],t[n]+t[n-1]+2*t[1]);
n-=2;
}
if(n==3)
{
sum+=t[1]+t[2]+t[3];
}
if(n==2)
{
sum+=t[2];
}
return sum;
}
int main()
{
int T,n;
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
Init(n);
if(n==1)
{
printf("%d\n",t[1]);
}
else if(n==2)
{
printf("%d\n",max(t[1],t[2]));
}
else if(n==3)
{
printf("%d\n",t[1]+t[2]+t[3]);
}
else
{
quick_Sort(t,1,n);
printf("%d\n",solve(n));
}
}
return 0;
}
//poj 1700
标签:1700,int,sum,C语言,渡河,poj,printf,else,回来 来源: https://blog.csdn.net/qq_56517253/article/details/122642149
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。