HEU预热赛

A题:
一道dp的题目
dp[i][j] = k 代表 i行放j个棋子有k中可能
dp[i][j] = dp[i-1][0] + dp[i-1][1] + dp[i-1][2] +...dp[i-1][j]
初始 dp[1][0] = 1, dp[1][1] = 1

注意点:

  1. BigInteger 否则爆栈
  2. 最后return 从1开始加
import java.util.*;
import java.math.*;

public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        BigInteger[][] dp = new BigInteger[110][110];
        for (int i = 0;i <= 109; i++)
            for(int j = 0;j <= 109; j++)
                dp[i][j] = new BigInteger("0");
        dp[1][0] = new BigInteger("1");
        dp[1][1] = new BigInteger("1");
        
        int n = sc.nextInt();
        for (int i = 2; i <= n ;i++){
            for (int j = 0; j <= i; j++){
                for (int k = 0; k <= j; k++){
                    dp[i][j] = dp[i][j].add(dp[i-1][k]);
                } 
            }
        }
        BigInteger ans = new BigInteger("0");
        for (int i = 1; i <= n; i++)
            ans = ans.add(dp[n][i]);
        System.out.println(ans);
    }
}

B题:用公式
不知道这个A的伴随矩阵公式,就很难受了- - 。。

import java.util.*;

public class Main2{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
        	int[][] A = new int[3][3];
        	for (int m = 0; m < 3; m ++) {
        		for (int n = 0; n < 3; n++) {
        			A[m][n] = sc.nextInt();
        		}
        	}
        	long ao = (A[0][0]* A[1][1]* A[2][2]) + (A[1][0]* A[2][1]* A[0][2]) + (A[2][0]* A[0][1]* A[1][2])
    				- (A[0][2]* A[1][1]* A[2][0]) - (A[0][0]* A[1][2]* A[2][1]) - (A[0][1]* A[1][0]* A[2][2]);
        	System.out.println(ao* ao);
        }
    }
}

C题:
一开始理解错了,他的意思是a^n,我还以为要a *=a;

import java.math.BigInteger;
import java.util.*;

public class Main3{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
            BigInteger a = new BigInteger("0"), n = new BigInteger("0"), b = new BigInteger("0");
        	a = sc.nextBigInteger();
        	n = sc.nextBigInteger();
        	b = sc.nextBigInteger();
        	System.out.println(a.modPow(n,b));
        }
    }
}

E题:
感觉巨他妈坑了,本来

××if (y1_xing == C)
××B --;
我都服了,被这个卡了小半天。。

import java.math.BigInteger;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

public class Main{
	static int y1_xing;	
	static boolean r;
	static int ny, nm, nd;
	static int[] monthofday = new int[]{-1,31,28,31,30,31,30,31,31,30,31,30,31};
	static int res;	    //这个月的几号
	
	public static boolean is_run(int year) {
		if (year % 400 == 0 ||(year % 4 == 0 && year % 100 != 0))
			return true;
		return false;
	}
	
	public static void gety1_xing(int ny,int y,int A, int B, int C) {
		y1_xing = 1;
		for (ny = 1850; ny < y; ny++) {
			for (nm = 1; nm <= 12; nm ++) {
				int month_ofday = monthofday[nm];
				if(is_run(ny) && nm == 2)	month_ofday += 1;
				for(nd = 1; nd <= month_ofday; nd++) {
					y1_xing += 1;
					if (y1_xing == 8)	y1_xing = 1; 
				}
			}
		}
		for(nm = 1;nm < A;nm++) {
			int month_ofday = monthofday[nm];
			if(is_run(y) && nm == 2) month_ofday += 1;
			for(nd = 1; nd <= month_ofday; nd++) {
				y1_xing += 1;
				if (y1_xing == 8)	y1_xing = 1; 
			}
		}
		boolean has = false;
		
		int month_ofday = monthofday[nm];
		if(is_run(y) && B == 2) month_ofday += 1;
		
		for (res = 1;res <= month_ofday; res++) {
			y1_xing += 1;
			if (y1_xing == 8) {
				y1_xing = 1;
			}
			if (y1_xing == C)
				B --;
			
			if (B == 0) {
				has = true;
				break;
			}
			
		}
		if(!has)	res = -1;
	}
	
    public static void main(String[] args) throws ParseException{
        Scanner sc = new Scanner(System.in);
        while (sc.hasNextInt()) {
            int A = sc.nextInt(), B = sc.nextInt(), C = sc.nextInt(), y = sc.nextInt();
            gety1_xing(ny,y, A, B, C);
            if (res != -1) {
            	Calendar c = Calendar.getInstance();
                c.set(Calendar.YEAR, y);
                c.set(Calendar.MONTH, A - 1);
                c.set(Calendar.DAY_OF_MONTH, res);
                Date d=new Date();
                d=c.getTime();
                SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd");
                String str=sdf.format(d);
                System.out.println(str);
            }
            else
            	System.out.println("none");
        }
    }
}

H题:
先打表,在找规律!

import java.math.BigInteger;
import java.util.*;

public class MainH{
	//打表 ->  找规律!
    //100 1-1 1-2 1-3 1-4....1-100
    //99 1-1 1-2 1-3...1-99
    //...
    //2 1-1 1-2
    //1 1-1
    public static void main(String[] args){
    	/*
    	for(int i = 1; i <= 10 ; i++) {
    		int[] a = new int[i + 1];	//计数从1开始
    		//经过i次
    		for(int j = 2; j <= i; j++) {
    			for(int k = 1; k*j < a.length; k++) {
    				a[k*j] = 1 - a[k*j];
    			}
    		}
    		for (int j = 1; j <= i; j++) {
    			System.out.print(a[j]+" ");
    		}
    		System.out.println();
    	}*/
    	
    	//找到规律:规律是:
    	//经过i次,为1的位置为:1 4 9 16 25 36 49 64 81 100 121 144
    	//					A=1,B=3
    	//4 - 1 - 1 = 2, 9 - 4 - 1 =4,
    	//16 - 9 - 1 = 6, 25 - 16 - 1 = 8
    	//依次增长2
    	
    	//1: 0 0 0 0 0
    	//2: 0 1 0 1 0
    	//3: 0 1 1 1 0
    	//4: 0 1 1 0 0
    	//5: 0 1 1 0 1
    	
    	Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        for (int i = 0; i < T; i++) {
            long N = sc.nextLong(), A = sc.nextLong(),B = sc.nextLong();
           	int start = 1;
           	int gap = 2;
           	while (start < A) {
           		start += gap + 1;
           		gap += 2;
           	}
            //start >= A
           	int res = 0;
           	while (start <= B) {
           		res ++;
           		start += gap + 1;
           		gap += 2;
           	}
           	System.out.println(B - A+1-res);
        }
    }
}

感觉没有练习过ACM 的确是做得磕磕拌拌,全是坑!!! 明天接着更剩下的题吧- - 。。

原文地址:https://www.cnblogs.com/whyaza/p/10734105.html