javaB组
· 1-3、结果填空
· 4-5、代码填空
· 6-7、结果填空
· 8-10、程序设计
七道小题,三道编程题,每道题分数呈递增
B组算法上只要掌握搜索和二分就可以进国赛了
1. 填空题求解方式不限。
填空题基本上暴力都可以跑出来,有些题目代码实现复查手算简单的可以手算,有些与日期有关的题可以查windows自带的日历。总之,怎么方便怎么来。
2.程序填空题基本上全是递归,既然是递归,函数往往不会只有一个地方调用自身,找一下其他调用自身的语句,稍微推理一下就能得出正确答案。
3.编程题不要空着!尽量想出最优解,想不出来写暴力,暴力都写不出来就直接写个输入然后输出样例的结果。第一个测试数据一般都是样例,这样写,写了就有分!
前七道小题里面有两道代码填空,一般是挖一个程序递归的关键代码或者递归前后变量的赋值。
这种题肯定是要反复看代码,琢磨变量的含义和作用才能做对,
当然不包括有的人胡乱试试出来,不过这种概率极低,
不如静心想想程序来的踏实,这种代码填空一般分值稍高,但一般在第四题或者第五题,所以并不是特别难。
第四题之前的题目大多比较简单了,一般多层循环就可以了,可能有的必须用递归,有的递归或者普通循环都可以做出来。
第六第七题就技术含量高一些,一般人可能做不出来,没事,根据自己水平,不行就放弃,不一定非要抓这个分。
就是纯粹for循环加分析一点递归代码的水平
2017第八届
1. 购物单
数据录入进行计算
8折是空格+八折替换空格+80
Excel出value是因为有空格
在word转表格后,替换空格
2. 纸牌三角形
生成1-9数组
Int a[]=new int[9]
生成三边
Int b[]=new int[3]
镜像除2,旋转除3
暴力破解
1. public class 纸牌三角形 {
2. public static void main(String[] args) {
3. int count=0;
4. for(int a=1;a<10;a++){
5. for(int b=1;b<10;b++){
6. if(a!=b)
7. for(int c=1;c<10;c++){
8. if(a!=b&&a!=c&&b!=c)
9. for(int d=1;d<10;d++){
10. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d)
11. for(int e=1;e<10;e++){
12. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d&&a!=e&&b!=e&&c!=e&&d!=e)
13. for(int f=1;f<10;f++){
14. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d&&a!=e&&b!=e&&c!=e&&d!=e&&a!=f&&b!=f&&c!=f&&d!=f&&e!=f)
15. for(int g=1;g<10;g++){
16. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d&&a!=e&&b!=e&&c!=e&&d!=e&&a!=f&&b!=f&&c!=f&&d!=f&&e!=f&&a!=g&&b!=g&&c!=g&&d!=g&&e!=g&&f!=g)
17. for(int h=1;h<10;h++){
18. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d&&a!=e&&b!=e&&c!=e&&d!=e&&a!=f&&b!=f&&c!=f&&d!=f&&e!=f&&a!=g&&b!=g&&c!=g&&d!=g&&e!=g&&f!=g&&a!=h&&b!=h&&c!=h&&d!=h&&e!=h&&f!=h&&g!=h)
19. for(int i=1;i<10;i++){
20. if(a!=b&&a!=c&&b!=c&&a!=d&&b!=d&&c!=d&&a!=e&&b!=e&&c!=e&&d!=e&&a!=f&&b!=f&&c!=f&&d!=f&&e!=f&&a!=g&&b!=g&&c!=g&&d!=g&&e!=g&&f!=g&&a!=h&&b!=h&&c!=h&&d!=h&&e!=h&&f!=h&&g!=h&&a!=i&&b!=i&&c!=i&&d!=i&&e!=i&&f!=i&&g!=i&&h!=i)
21. if((a+b+c+d)==(a+e+f+g)&&(a+b+c+d)==(d+h+i+g))
22. count++;
23.
24.
25. }
26. }
27. }
28. }
29. }
30. }
31. }
32. }
33. }
34. System.out.println(count/(3*2));
35. }
36.}
3. 承压计算
把数字直接存入数组,直接复制在控制台,他们本来就是用空格隔开的,比较方便,直接复制粘贴
这样在数组中从上至下,加上 “上方和左上方”值的一半就行。
用两个for循环,将上一层的重量平分到下一层的,最后将最后一层的数据取出,用2086458231 除以 最小值得到每一份的大小,再乘以最大值
1. import java.util.Arrays;
2. import java.util.Scanner;
3.
4. public class 承压计算 {
5. public static void main(String[] args) {
6. Scanner s=new Scanner(System.in);
7. double arr[][]=new double[30][30];
8. for(int i=0;i<29;i++){
9. for(int j=0;j<=i;j++){
10. arr[i][j]=s.nextInt();
11. }
12. }
13. for(int i=1;i<30;i++){
14. for(int j=0;j<=i;j++){
15. if(j==0)
16. arr[i][j]+=arr[i-1][j]*1.0/2;
17. else arr[i][j]+=arr[i-1][j]*1.0/2+arr[i-1][j-1]*1.0/2;;
18. }
19. }
20. Arrays.sort(arr[29]);
21. System.out.println(2086458231/arr[29][0]*arr[29][29]);
22. }
23.}
4.魔方状态
转化为123,注意排重
5. 取数位
尾数(第k位=长度)对10取余数,不断循环
定值是第k位,调整长度(除以10),让长度=k
第三位,长度为3,利用尾数算法
F(x/10,k)
6. 最大公共子串
矩阵法,动态规划dp
a[i][j]表示字符串s1的i位置和s2的j位置的最大公共子串的长度
如果s1的字符串的第一个字符和s2的第一个字符相同,那么a[1][1] = 1;
如果两个字符串的第二个字符和相同,那么,到第二个位置的最长公共子串就等于1+1 = 2,也就是到第一个字符的公共子串的个数+1。
从第一个位置开始,相同的就加1
所以a[i][j]=a[i-1][j-1]+1
7. 日期问题
8. 包子凑数
9. 分巧克力
10. k倍区间