nyoj 47
2016-02-10 20:33
232 查看
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=47
分析:
如果n==1或者n==2,所有人直接过河即可;
如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ;
如果n>=4,设a[0]表示用时最短的人所用的时间,a[1]为用时第二短的人所用的时间,a[n-1]表示用时最长的人所用的时间,a[n-2]表示用时第二长的人所用的时间。那么:
当2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]时,就先让用时最短的人和用时最长的人一起过去,然后用时最短的回来,接着让用时最短的和用时第二长的一起过去,再让用时最短的回来。
否则,就先让用时最短的和用时第二短的一起过去,然后用时最短的回来,接着让用时最长和用时第二长的一起过去,再让用时第二短的回来。这样就相当于剩下了n-2个人。对这n-2个人执行相同的操作,知道剩下不足4个人即可。
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
int T, n, i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum = 0;
while(n >= 4)
{
if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2]))
{ //求出最长的两个人过桥所用的最短时间
sum += a[n-1]; //用时最短的和用时最长的一起过去
sum += a[0]; //用时最短的回来
sum += a[n-2]; //用时最短的和用时第二长的一起过去
sum += a[0]; //用时最短的回来
}
else
{
sum += a[1]; //最短的和第二短的一起过去
sum += a[0]; //最短的回来
sum += a[n-1]; //最长的和第二长的一起过去
sum += a[1]; //第二短的回来
}
n -= 2;
}
if(n == 3)
sum += a[1] + a[0] + a[2];
else if(n == 2)
sum += a[1];
else
sum += a[0];
printf("%d\n",sum);
}
return 0;
}
分析:
如果n==1或者n==2,所有人直接过河即可;
如果n==3,用时最短的和用时最长的一起过去,然后用时最短的回来,再和剩下的一个人过去 ;
如果n>=4,设a[0]表示用时最短的人所用的时间,a[1]为用时第二短的人所用的时间,a[n-1]表示用时最长的人所用的时间,a[n-2]表示用时第二长的人所用的时间。那么:
当2a[1] + a[0] + a[n-1] > 2a[0] + a[n-1] + a[n-2]时,就先让用时最短的人和用时最长的人一起过去,然后用时最短的回来,接着让用时最短的和用时第二长的一起过去,再让用时最短的回来。
否则,就先让用时最短的和用时第二短的一起过去,然后用时最短的回来,接着让用时最长和用时第二长的一起过去,再让用时第二短的回来。这样就相当于剩下了n-2个人。对这n-2个人执行相同的操作,知道剩下不足4个人即可。
#include<stdio.h>
#include<algorithm>
using namespace std;
int a[1005];
int main()
{
int T, n, i;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(i = 0; i < n; i++)
scanf("%d",&a[i]);
sort(a,a+n);
int sum = 0;
while(n >= 4)
{
if((a[1] * 2 + a[n-1] + a[0]) > (2 * a[0] + a[n-1] + a[n-2]))
{ //求出最长的两个人过桥所用的最短时间
sum += a[n-1]; //用时最短的和用时最长的一起过去
sum += a[0]; //用时最短的回来
sum += a[n-2]; //用时最短的和用时第二长的一起过去
sum += a[0]; //用时最短的回来
}
else
{
sum += a[1]; //最短的和第二短的一起过去
sum += a[0]; //最短的回来
sum += a[n-1]; //最长的和第二长的一起过去
sum += a[1]; //第二短的回来
}
n -= 2;
}
if(n == 3)
sum += a[1] + a[0] + a[2];
else if(n == 2)
sum += a[1];
else
sum += a[0];
printf("%d\n",sum);
}
return 0;
}
相关文章推荐
- 1.一些 贪心算法 的简单思维题:
- 贪心算法——字典序最小问题
- 贪心算法——区间调度问题
- Jump Game I,II 贪心
- Wildcard Matching
- 贪心法实现无向图的划分 代码
- 贪心题目循环和控制台折行
- HDOJ 1009
- 【解题报告】【USACO】酸奶工厂
- 【解题报告】【】交谊舞
- POJ 1328
- Best Cow Line
- HDU 1009 Fatmouse's Trade
- POJ2377 Bad Cowtractors
- 贪心 hdu 1003
- 最大容器
- 满足和为定值的两个数或多个数
- Codeforces Round #300
- HUD1052 __ P2 1002 __ Tian Ji -- The Horse Racing
- 2015年国家集训队测试 BZOJ3816矩阵变幻