个人赛组2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)-正式赛
Posted nuist__NJUPT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人赛组2021-2022年度第三届全国大学生算法设计与编程挑战赛(秋季赛)-正式赛相关的知识,希望对你有一定的参考价值。
目录
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年度第三届全国大学生算法设计与编程挑战赛(秋季赛)- 占座位(最小割)