首页 > 其他分享 >士兵过河

士兵过河

时间:2023-08-07 10:00:54浏览次数:68  
标签:13 过河 int 用时 划船 士兵

题目描述

一支士兵过河_java个士兵的军队正在趁夜色逃亡 途中遇到一条湍急的大河敌军在士兵过河_System_02的时长后到达河面, 没到过对岸的士兵都会被消灭。

现在军队只找到了士兵过河_java_03只小船,这船最多能同时坐上士兵过河_System_04个士兵。

  1. 士兵过河_java_03个土兵划船过河,用时为 士兵过河_java_06
  2. 士兵过河_System_04个士兵坐船同时划船过河时,用时为士兵过河_用例_08两土兵中用时最长的.
  3. 士兵过河_System_04个士兵坐船士兵过河_java_03个士兵划船时,用时为 士兵过河_java_11 士兵过河_用例_12为划船士兵用时
  4. 如果士兵下河游泳,则会被湍急水流直接带走,算作死亡

请帮忙给出一种解决方案,保证存活的士兵最多,且过河用时最短.

输入描述

第一行:士兵过河_java表示士兵数士兵过河_java_14 第二行:士兵过河_System_02表示敌军的到达时长士兵过河_System_16 第三行:士兵过河_用例_17

  • 士兵过河_用例_12表示每一个士兵的过河时长
  • 士兵过河_System_19

输出描述

第一行:“最多存活的士兵数” “最短用时”

备注

  1. 两个士兵的同时划船时,如果划速不同则会导致船原地转圈圈;所以为保持两个士兵划速相同,则需要向划的慢的士兵看齐
  2. 两个士兵坐船时,重量增加吃水加深,水的阻力增大,同样的力量划船速度会变慢
  3. 由于河水湍急大量的力用来抵消水流的阻力,所以 条件2 中过河用时不是 士兵过河_java_20而是士兵过河_java_11

用例

  • 用例1
--输入
5
43
12 13 15 20 50

--输出
3 40

--说明
	可以达到或小于43的一种方案
	第一步: a[0] a[1]过河用时: 13
	第二步: a[0] 返回用时: 12
	第三步: a[0] a[2]过河用时: 15
  • 用例2
--输入
5
130
50 12 13 15 20

--输出
5 128

--说明
	可以达到或小于130的一种方案:
	第一步: a[1] a[2] 过河用时: 13
	第二步: a[1] 返回用时:12
	第三步: a[0] a[4]过河用时: 50
	第四步: a[2] 返回用时: 13
	第五步: a[1] a[2] 过河用时: 13
	第六步: a[1] 返回用时:12
	第七步: a[1] a[3] 过河用时:15
	所以输出为:
	5 128
  • 用例3
--输入
7
171
25 12 13 15 20 35 20

--输出
7 171

--说明
	可以达到或小于 171 的一种方案:
	第一步: a[1] a[2] 过桥用时: 13
	第二步: a[1] 带火把返回用时: 12
	第三步: a[0] a[5] 过桥用时: 35
	第四步: a[2] 带火把返回用时: 13
	第五步: a[1] a[2] 过桥用时: 13
	第六步: a[1] 带火把返回用时: 12
	第七步: a[4] a[6] 过桥用时: 20
	第八步: a[2] 带火把返回用时: 13
	第九步: a[1] a[3] 过桥用时: 15
	第十步: a[1] 带火把返回用时: 12
	第十一步: a[1] a[2] 过桥用时: 13
	所以输出为:
	7 171

code show + analysis

package com.hw;

import java.util.Arrays;
import java.util.Scanner;

/**
 * desc :  士兵过河.
 * <p>  <a href="https://fcqian.blog.csdn.net/article/details/128325033">...</a>
 * create time : 2023/3/14 18:16
 */
public class SoldierRiver {

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while(in.hasNextInt()) {
            int N = in.nextInt();
            int T = in.nextInt();
            int[] time = new int[N];
            for (int i = 0; i < N; i++) {
                time[i] = in.nextInt();
            }

            soldierCrossRiver(N, T, time);
        }
    }

    /*
     *  根据题目意思,那么一共有两种划船方案
     *  |-  一个人坐船,一个人划船,用时为  a[i] * 10 -- 即划船的人所用时长 * 10
     *  |-  两个人同时划船,用时为  max(a[i], a[j])
     *
     *  ----那么首先,可以将所有士兵的划船时间进行排序.
     *
     *  记划船最快的前两个士兵为 士兵 A、B
     *  那么
     *  方案一:A+B 过河  A 返回  A 再带第三个人过河
     *  方案二:B带第三个人过河  B 返回  A 带第四个人过河 A 返回 A+B
     *
     *  即 最佳过河方案在  A B 不断返回的过程中得到
     *
     *  适合用动态规划求解
     *  1 个士兵过河,最快的直接划船过去
     *  2 个士兵过河,划船 第一快和第二快 的士兵一起划船过去
     *  3 个士兵过河,第一和第二 先过河,第一回来,再带一个人过河
     *  4 个士兵过河:有两种方案
     *              A B 先过去,A 回来,3 4过去,B 回来,A B 再过去
     *              3 个人已经过去了,A 回来,带一个人过去
     */

    private static void soldierCrossRiver(int N, int T, int[] time) {
        Arrays.sort(time);
        // 划船最快的士兵
        int time0 = time[0];
        // 划船第二快的士兵
        int time1 = time[1];

        if(time0 > T) {
            // 一个都过不去河
            System.out.print(0 + " " + 0);
        }

        // dp[i] 表示第 i 个人过河所用的时间
        int[] dp = new int[N + 1];

        dp[1] = time0;
        // 两个人一起划船过河,取一个最佳方案.
        dp[2] = getTime(time0, time1);

        boolean flag = true;
        for (int i = 3; i <= N; i++) {
            // 方案一:i - 1 个人过河的时间 + 最快的人回来的时间 + 带当前人去的时间.
            int planA = dp[i - 1] + time0 + getTime(time0, time[i - 1]);
            // 方案二:i - 2 个人过河的时间 + 第二块的人回来的时间 + 当前人和前一个人去的时间 + 第一快的人去的时间
            int planB = dp[i - 2] + time0 + getTime(time[i - 2], time[i - 1]) + time1 + dp[2];

            dp[i] = Math.min(planA, planB);

            if(dp[i] > T) {
                flag = false;
                // 这里表示只能过去 i - 1 个人了
                System.out.print((i - 1) + " " + dp[i - 1]);
                break;
            }
        }

        if(flag) {
            System.out.print(N + " " + dp[N]);
        }
    }

    // timeA < timeB
    private static int getTime(int timeA, int timeB) {
        return Math.min(timeA * 10, timeB);
    }

}

标签:13,过河,int,用时,划船,士兵
From: https://blog.51cto.com/u_16079703/6991057

相关文章

  • 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头
    2023-08-06:小青蛙住在一条河边,它想到河对岸的学校去学习小青蛙打算经过河里的石头跳到对岸河里的石头排成了一条直线,小青蛙每次跳跃必须落在一块石头或者岸上给定一个长度为n的数组arr,表示每块儿石头的高度数值每块石头有一个高度,每次小青蛙从一块石头起跳这块石头的高度就......
  • 2023-08-06:小青蛙住在一条河边, 它想到河对岸的学校去学习 小青蛙打算经过河里 的石头
    2023-08-06:小青蛙住在一条河边,它想到河对岸的学校去学习小青蛙打算经过河里的石头跳到对岸河里的石头排成了一条直线,小青蛙每次跳跃必须落在一块石头或者岸上给定一个长度为n的数组arr,表示每块儿石头的高度数值每块石头有一个高度,每次小青蛙从一块石头起跳这块石头的......
  • P1002 [NOIP2002 普及组] 过河卒 入门级别的dp
     思路:1.标记马点z[i][[j]=02.正常z[i][j]=z[i-1][j]+z[i][j-1]#include<iostream>usingnamespacestd;intn,m,a,b;longlongma[30][30],bck[30][30];intdx[8]={-2,-1,1,2,2,1,-1,-2},dy[8]={1,2,2,1,-1,-2,-2,-1};voidcan_not_reach(intx,inty){ma[......
  • 5944: 小船过河 经典贪心
    描述  N个人要过河,但只有一条小船,每次只能坐2人,每个人有不同的划船速度,而两个人一起过河时小船速度由最慢的人的速度决定。请设计一个过河方案,使得所有人均过河,且所用总时间最少。   输入  第一行为正整数N(N<=1000),表示人数,第二行为N个正整数,表示每个人的速度(......
  • 【搜索】 FZU 2188 过河I
    bfs搜索,x,y和船停的地方。#include<iostream>#include<queue>#include<stack>#include<map>#include<set>#include<bitset>#include<cstdio>#include<algorithm>#include<cstring>#include<climits>......
  • 过河卒
     /#include<iostream>//usingnamespacestd;//boolvis[25][25];//longlongstep[25][25];//就是dp数组//intmain()//{// step[1][1]=1;// intn,m,x,y;// cin>>n>>m>>x>>y;// n++;// m++;// x++;// y++;// vis[x][y]=1;// vi......
  • [NOIP2002 普及组] 过河卒
    [NOIP2002普及组]过河卒题目描述棋盘上\(A\)点有一个过河卒,需要走到目标\(B\)点。卒行走的规则:可以向下、或者向右。同时在棋盘上\(C\)点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。棋盘用坐标表示,\(A\)点\((0......
  • [省选联考2023] 过河卒
    [省选联考2023]过河卒题目背景棋盘上有一个过河卒,需要走到底线。卒行走的规则是可以向左移动一格,向右移动一格或者向前移动一格。同时在棋盘上有两个另一方的棋子,需要拦截这个卒走到底线。这两个棋子的走法和帅一致,可以走到前后左右四个方向上相邻的格子。因此本题可以称为“......
  • 联合省选2023 D2T1 过河卒
    我们可以先\(dp\),设\(f_{i,j,k,l}\)和\(g_{i,j,k,l}\)表示当前三个棋子分别在点\(i,j,k\),目前轮到\(l\)走,谁胜利,最终会走多少步。然后我们发现,变成一个有向图博弈。并且\(l\)是由\(i,j,k\)的奇偶性唯一确定的。就可以在图上直接做了。首先我们发现,我们其实可以把初始......
  • 「解题报告」P9169 [省选联考 2023] 过河卒
    挺套路的博弈论,实际上就是GameonGraph与GameonGraph,但是考场上多测没清空挂了。寄。并且不过ABC那个官方题解好像给的是\(O(m\logn)\)的做法,放这题是过不去的啦x首先显然三个棋子压状态大概是\(10^6\)级别的,多测\(T=10\),那么猜测是一个\(O(Tn^6)\)的做法。......