【个人赛组】2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)-正式赛

目录

A题-登神长阶

C题-网络流

E题-老鹰捉小鸡

H题-买装备


A题-登神长阶

 思路:注意是t是秒,不是分钟,先转换成分钟,然后就是一个简单的递推了。 

​
import java.util.Scanner;

//1-登神长阶
public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
        int t = input.nextInt() ;
        int m = t / 60 ;
        int [] dp = new int [m+1] ;

        if(m==0){
            System.out.println(0);
        }
        if(m==1 || m==2 || m==3){
            System.out.println(1);
        }

        if(m>3){
            dp[1]=dp[2]=dp[3] = 1 ;
            for(int i=4; i<=m; i++){
                dp[i] = dp[i-1] + dp[i-2] + dp[i-3] ;
                dp[i] = dp[i] % 425 ;
            }
            System.out.println(dp[m]);
        }
    }
}

​

C题-网络流

思路:这题思路很简单,就是建立一个环,然后搜索,以所有顶点进行搜索,搜索到初始顶点的前一个顶点结束,每轮搜索找到一圈的最小值,最后找出每一轮的最大值即可,不过需要剪支,否则会超时,就是如果当前找到的最小值并不是下一轮搜索的起点,则直接跳过,不用搜索以该点为起点继续搜索。

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static int max = Integer.MIN_VALUE ;
    static int min  ;
    static int n ;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
         n = input.nextInt() ;
        int [] a = new int [n] ;
        List<int []> [] g = new List[n] ;


        for(int i=0; i<n; i++){
            a[i] = input.nextInt() ;
            g[i] = new ArrayList<>() ;
        }

        for(int i=0; i<n-1; i++){ //构建邻接表,就是一个环
            g[i].add(new int []{i+1, a[i]}) ;
        }
        g[n-1].add(new int [] {0, a[n-1]}) ;

        int x = 0 ;
        for(int i=0; i<n; i++){
            min =  Integer.MAX_VALUE ;
            if(i>0){
                x = i - 1;
            }else{
                x = n - 1;
            }

            max = Math.max(max, dfs(i, g, x)) ;
            while(i<n && g[i].get(0)[1]!=max){
                i ++ ;
            }
        }
        System.out.println(max);
    }
    private static int dfs(int i, List<int[]> [] g, int x){
        for(int j=i; j!=x; j=g[j].get(0)[0]){
            min = Math.min(min, g[j].get(0)[1]) ;
        }
        return min ;
    }
}

E题-老鹰捉小鸡

 

正确思路:背包问题,dp,AC代码如下:

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //dp[i]表示i名同学的最大攻击值
        Scanner input = new Scanner(System.in) ;
        int n = input.nextInt() ;
        int [] b = new int [n+1] ;
        int [] a = new int [n+1] ;
        int [] dp = new int [n+1] ;
        for(int i=1; i<=n; i++){
            b[i] = input.nextInt() ;
        }
        for(int i=1; i<=n; i++){
            a[i] = input.nextInt() ;
        }

        for(int i=1; i<=n; i++){
            for(int j=n; j>=b[i]; j--){
                dp[j] = Math.max(dp[j], dp[j-b[i]] + a[i]) ;
            }
        }
        System.out.println(dp[n]);

    }
}

H题-买装备

建树,更新,查询,不过超时了,就这样吧,心累!!!

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Main {
    static int n ;
    static List<Integer> [] g ;
    static int [] val ;
    static int ans ;
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in) ;
        g = new List[200010] ;
        val = new int [200010] ;
        for(int i=0; i<200010; i++){
            g[i] = new ArrayList<>() ;
        }
         n = input.nextInt() ;
        for(int i=0; i<n-1; i++){
            int x = input.nextInt() ;
            int y = input.nextInt() ;
            g[x].add(y) ;
        }
        int q = input.nextInt() ;

        for(int i=0; i<q; i++){
            int opt = input.nextInt() ;
            int x , k ;
            ans = Integer.MIN_VALUE ;
            if(opt==1){
                x = input.nextInt() ;
                k = input.nextInt() ;
                update(x, k) ;
            }else{
                x = input.nextInt() ;
                System.out.println(query(x));

            }
        }
    }
    private static void update(int x, int k){
        val[x] += k ;
        for(int i=0; i<g[x].size(); i++){
            update(g[x].get(i), k);
        }
    }
    private static int query(int x){
        ans = Math.max(val[x], ans) ;
        for(int i=0; i<g[x].size(); i++){
            ans = Math.max(ans, query(g[x].get(i))) ;
        }
        return ans ;
    }
}

路还很长,慢慢来吧,少年!!!

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nuist__NJUPT

给个鼓励吧,谢谢你

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值