目录
一、ASC
这题很快乐!!!
System.out.println((int)'L');
二、排列数
这题写起来很快乐!!!
解析:
这题是手推dp的,先上两张手推图,比较dp都要搞一下,盲想想不出来
第一步:带入几组数据:
1 1
2 2
3 2 4
4 2 12 10
5 2 28 58 32
然后,你就去寻找每一个数的关系式,去一步一步推导公式
每一个值都是通过前面的数值得到,所以在推导的时候,选出部分数据可以推导一个通用公式;
具体推可以看看我的草稿纸好吧
代码:
import java.util.Scanner;
public class 排列数 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
long [][]arr=new long[n+1][n+1];
//初始情况,1/2不存在出现转折点,但是存在0转折
//1对应的 1
//2对应的 12 21
arr[1][1]=1;
arr[2][1]=2;
//判断n的情况
if (n<=2){
System.out.println(arr[n][1]);
return;
}
for (int i=3;i<=n;i++){
for (int j=1;j<=i;j++){
if (j==1){
arr[i][j]=2;
}else{
//转移方程
arr[i][j]=(arr[i-1][j]*j+arr[i-1][j-1]*2+arr[i-1][j-2]*(i-j))%123456;
}
}
}
System.out.print(arr[n][m]);
}
}
三、平面切分
这题看着很快乐!!!
解析:
这题数据并不大,最多只有1000条直线,所以直接爆算其实也可以得到答案
(1+1000)*1000/2,也就那么几十万次运算,但是有写点需要注意:
1.是否出现重复的线段?
2.是否出现互相平行的线段?
然后我们其实可以找一下多线相交后会多出的空间数的规律
具体情况可以自己在纸上画一下,这里就不推了
每一条新线放入形成x个交点,则增加x+1个平面
比如三条线
第一条线放入分成两歌平面,第二条和第一条有交点则分为4个平面,平行则分成3个平面;
第三条如果和前两条交点各不相同,则有2个交点,新增3个平面,在同一个交点上则新增两个平面,三线平行则新增1个平面
代码:
import java.util.Scanner;
public class 平面切分 {
public static void main(String args[]) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int[] arr = new int[n];
int[] brr = new int[n];
double[] crr = new double[n - 1];
int count = 1;
int flag,s;
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
brr[i] = sc.nextInt();
if (i == 0) {
count++;
continue;
}
flag = 0;//用于判断重复线段
for (int j = 0; j < i; j++) {
if (arr[j] == arr[i] && brr[j] == brr[i])//说明重复
flag = 1;
}
if (flag == 1) {//去除重复线段
i--;
n--;
continue;
}
s = 0;
for (int j = 0; j < i; j++) {
if (arr[i] == arr[j]) {//和该点平行,代表交点不可能重复
s++;
continue;
}
//查找交点数
crr[j - s] =(brr[i] - brr[j]) / (double) (arr[j] - arr[i]);
flag = 0;
for (int k = 0; k < j - s; k++) {//s是平行数
if (crr[k] == crr[j - s])
flag = 1;
}
if (flag == 0)
count++;
}
count++;
}
System.out.println(count);
}
}