最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

过桥

互联网 admin 39浏览 0评论

过桥

过桥

思路

这道题可以用DP来做。
先把人按过去的时间从小到大排序,而且这个手电筒的传递都是有第一第二位来传(这样时间才最短)。
f[i]为前i个人过去所需的最短时间,那么方程就是 f [ i ] = m i n ( f [ i − 1 ] + a [ i ] + a [ 1 ] , f [ i − 2 ] + a [ 1 ] + a [ 2 ] + a [ 2 ] + a [ i ] ) ; f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[1]+a[2]+a[2]+a[i]); f[i]=min(f[i−1]+a[i]+a[1],f[i−2]+a[1]+a[2]+a[2]+a[i]);
(左边是只要第一位传,右边是第一第二位一起传,用时间更短的那个方法传)

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1001],f[1001];
int main()
{scanf("%d",&n);//读入for (int i=1;i<=n;i++) scanf("%d",&a[i]);//读入sort(a+1,a+n+1);//排序(从小到大)f[1]=a[1];f[2]=a[2];//初始化for (int i=3;i<=n;i++)f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[1]+a[2]+a[2]+a[i]);//动态转移方程printf("%d",f[n]);//输出return 0;
}

过桥

过桥

思路

这道题可以用DP来做。
先把人按过去的时间从小到大排序,而且这个手电筒的传递都是有第一第二位来传(这样时间才最短)。
f[i]为前i个人过去所需的最短时间,那么方程就是 f [ i ] = m i n ( f [ i − 1 ] + a [ i ] + a [ 1 ] , f [ i − 2 ] + a [ 1 ] + a [ 2 ] + a [ 2 ] + a [ i ] ) ; f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[1]+a[2]+a[2]+a[i]); f[i]=min(f[i−1]+a[i]+a[1],f[i−2]+a[1]+a[2]+a[2]+a[i]);
(左边是只要第一位传,右边是第一第二位一起传,用时间更短的那个方法传)

代码

#include<cstdio>
#include<algorithm>
using namespace std;
int n,a[1001],f[1001];
int main()
{scanf("%d",&n);//读入for (int i=1;i<=n;i++) scanf("%d",&a[i]);//读入sort(a+1,a+n+1);//排序(从小到大)f[1]=a[1];f[2]=a[2];//初始化for (int i=3;i<=n;i++)f[i]=min(f[i-1]+a[i]+a[1],f[i-2]+a[1]+a[2]+a[2]+a[i]);//动态转移方程printf("%d",f[n]);//输出return 0;
}
发布评论

评论列表 (0)

  1. 暂无评论