牛客NC83、54-20.7.27-堆、dp

本文详细解析了牛客网上的NC83和NC54两道算法题目,NC83通过优先队列实现工厂货物装卸调度,NC54采用动态规划解决路径选择问题。文章提供了完整的代码实现及思路分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NC83
链接牛客网NC83
题意、输入、输出
在这里插入图片描述

分析:先来先装卸,所以记录在装卸的工厂完成时间和没有装卸的工厂的到达时间,一旦有工厂装卸完毕,就将最早来的还没装卸的工厂开始装卸,根据两者完成时间和到达的时间计算完成时间,不断直到所有工厂装卸完成。
思路:开始对所有工厂按到达时间排序,使用小顶堆维护正在装卸的工厂完成时间,开始k个工厂入堆,后面的比较堆顶和最小到达时间,后者大不停出栈,最后将这最小到达时间的判断计算完成时间加入堆。
代码

import java.util.*;
 
 
class shop implements  Comparable{
    long a;
    long b;
 
    @Override
    public int compareTo(Object o) {
         shop s=(shop)o;
         return (int)(a-s.a);
    }
}
public class Solution {
    /**
     *
     * @param n int整型
     * @param k int整型
     * @param a int整型一维数组
     * @param b int整型一维数组
     * @return long长整型
     */
    public long solve (int n, int k, int[] a, int[] b) {
        // write code here
        PriorityQueue<Long> que=new PriorityQueue<>();
        shop[] hh=new shop[n];
        for(int i=0;i<n;i++){
            hh[i]=new shop();
            hh[i].a=a[i];
            hh[i].b=b[i];
        }
        Arrays.sort(hh);
        int cnt=0;
        while(cnt<n){
            if(cnt<k)que.add(hh[cnt].a+hh[cnt++].b);
            else {
                long tem=que.poll();
                if(tem<hh[cnt].a)tem=hh[cnt].a;
                que.add(tem+hh[cnt++].b);
            }
        }
        long maxx=0;
        while(que.size()>0){
            maxx=que.poll();
        }
        return maxx;
    }
}

NC54
链接
牛客网NC54
题意、输入、输出
在这里插入图片描述
分析:dp,注意先从行转移到列
思路:dp
代码

import java.util.*;


public class Solution {
    /**
     * 简单变相
     * @param n int整型 
     * @param m int整型 
     * @param x int整型一维数组 
     * @param y int整型一维数组 
     * @return int整型
     */
    static int MOD=(int)1e9+7;
    public int solve (int n, int m, int[] x, int[] y) {
        // write code here
        boolean[][] vis=new boolean[3][n];
        for(int i=0;i<m;i++){
            vis[x[i]-1][y[i]-1]=true;
        }
        long[][] dp=new long[3][n];
        dp[0][0]=1;
        for(int j=0;j<n-1;j++){
            for(int i=0;i<3;i++){
                if(!vis[i][j+1]){
                    dp[i][j+1]=(dp[i][j+1]+dp[i][j])%MOD;
                }
                if(i-1>=0&&!vis[i-1][j+1]){
                    dp[i-1][j+1]=(dp[i-1][j+1]+dp[i][j])%MOD;
                }
                if(i+1<3&&!vis[i+1][j+1]){
                    dp[i+1][j+1]=(dp[i+1][j+1]+dp[i][j])%MOD;
                }
            }
        }
        return (int)dp[2][n-1];
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值