第八题:杨辉三角形
题目大意
解题思路
我是看见这个题,没想别的方法,直接去找规律了。果不其然,发现了规律。
每个不同数字对应的第几个数可以算出来:
数: 1 2 3 4 5
下标: 3 5 8 12 17
相差: 2 3 5 8 12
可以通过代码把1,2,3,4,5在这一列的下标算出来
int[] count = new int[N+1];
count[1] = 3;//第一个取3只是为了方便计算,符合规律
for (int i = 2; i <= N; i++) {
count[i] = i+count[i-1];
//System.out.print(count[i]+" ");
}
每个不同数字对应的第几个数可以算出来:
数: 1 3 6 10
下标: 6 9 13 18
相差: 5 6 7 8
可以通过代码把1,3,6,10在这一列的下标算出来
int[] count = new int[N+1];
int[] count1 = new int[N+1];
int temp = 1;
count1[1] = 6;
for (int i = 3;i<=N;i++) {
if ((temp+i-1)<=N) {
int temp1 = temp;
temp = temp + i - 1;
count1[temp] = count1[temp1] + i;
//System.out.print(count1[temp]+" ");
}
}
然后,建立数组resolve[N],比较count数组和count1数组,如果是同一个数,取下标最小的为正确答案.
int[] resolve= new int[N+1];
resolve[0] = 0;
resolve[1] = 1;
for (int i = 2; i <=N; i++) {
if(count[i]!=0 && count1[i]!=0 && count1[i]<count[i]){
resolve[i] = count1[i];
}else {
resolve[i] = count[i];
}
}
//System.out.println("\n");
System.out.println(resolve[N]);
完整代码
package 蓝桥杯环境;
import java.io.BufferedInputStream;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//Scanner scanner = new Scanner(System.in);
Scanner scanner = new Scanner(new BufferedInputStream(System.in));
int N = scanner.nextInt();
long start = System.currentTimeMillis();
int[] count = new int[N+1];
int[] count1 = new int[N+1];
int temp = 1;
count[1] = 3;
count1[1] = 6;
for (int i = 2; i <= N; i++) {
count[i] = i+count[i-1];
//System.out.print(count[i]+" ");
}
//System.out.println("\n");
for (int i = 3;i<=N;i++) {
if ((temp+i-1)<=N) {
int temp1 = temp;
temp = temp + i - 1;
count1[temp] = count1[temp1] + i;
//System.out.print(count1[temp]+" ");
}
}
int[] resolve= new int[N+1];
resolve[0] = 0;
resolve[1] = 1;
for (int i = 2; i <=N; i++) {
if(count[i]!=0 && count1[i]!=0 && count1[i]<count[i]){
resolve[i] = count1[i];
}else {
resolve[i] = count[i];
}
}
//System.out.println("\n");
System.out.println(resolve[N]);
long finish = System.currentTimeMillis();
long timeElapsed = finish - start;
System.out.println(timeElapsed / 1000.0);
}
}
输入:1000000
输出:1784293666
用时:0.015
感觉结果还可以,这是一个笨方法,找规律,建议还是学习组合或者dp算法来解决此题。