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

Posted nuist__NJUPT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人赛组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 ;
    

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

以上是关于个人赛组2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)-正式赛的主要内容,如果未能解决你的问题,请参考以下文章

2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛)-正式赛 部分题解

2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛正式赛) 部分题题解

2021-2022年度第三届全国大学生算法设计与编程挑战赛(冬季赛正式赛) 部分题题解

2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)

2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)

2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)