目录
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 ;
}
}
路还很长,慢慢来吧,少年!!!