2020年09月 HNUCM-OJ算法分析与设计作业8

@ZHANGQIANYI2020

HNUCM-OJ 习题6-6 杨辉三角,小白鼠,放苹果,数字交换,棋盘覆盖问题,整数划分问题之备忘录法

问题 A: 习题6-6 杨辉三角

(时间限制: 1 Sec 内存限制: 12 MB)

题目描述:

按要求输出如下格式的杨辉三角
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
最多输出10层。

输入:

输入只包含一个正整数n,表示将要输出的杨辉三角的层数。

输出:

对应于该输入,请输出相应层数的杨辉三角,每一层的整数之间用一个空格隔开。

样例输入:

5

样例输出:

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1

参考答案:

import java.util.Scanner;
 
public class Main{
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int a[][]=new int[n+1][n+1];
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=i;j++) {
                    if(i==j) {
                        a[i][j]=1;
                    }
                    else if(i==1||j==1) {
                        a[i][j]=1;
                    }else {
                        a[i][j]=a[i-1][j-1]+a[i-1][j];
                    }
                }
            }
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=i;j++) {
                    System.out.print(a[i][j]+" ");
                }
                System.out.println();
            }   
        }
    }
}

问题 B: 小白鼠

(时间限制: 1 Sec 内存限制: 128 MB)
题目描述:

N只小白鼠(1 <= N <= 100),每只鼠头上戴着一顶有颜色的帽子。
现在称出每只白鼠的重量,要求按照白鼠重量从大到小的顺序输出它们头上帽子的颜色。
帽子的颜色用“red”,“blue”等字符串来表示。
不同的小白鼠可以戴相同颜色的帽子。白鼠的重量用整数表示。

输入:

多案例输入,每个案例的输入第一行为一个整数N,表示小白鼠的数目。
下面有N行,每行是一只白鼠的信息。第一个为不大于100的正整数,表示白鼠的重量;
第二个为字符串,表示白鼠的帽子颜色,字符串长度不超过10个字符。
注意:白鼠的重量各不相同。

输出:

每个案例按照白鼠的重量从大到小的顺序输出白鼠的帽子颜色。

样例输入:

3
30 red
50 blue
40 green

样例输出:

blue
green
red

参考答案:

import java.util.Scanner;  
    
public class Main {  
    public static void main(String[] args) {  
        Scanner sc=new Scanner(System.in);  
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int a[]=new int[n];
            String b[]=new String[n];
            for(int i=0;i<n;i++) {
                a[i]=sc.nextInt();
                b[i]=sc.next();
            }
            for(int i=0;i<n;i++) {
                for(int j=i+1;j<n;j++) {
                    if(a[i]<a[j]) {
                        int s=a[i];
                        a[i]=a[j];
                        a[j]=s;
                        String color=b[i];
                        b[i]=b[j];
                        b[j]=color;
                    }
                }
            }
            for(int i=0;i<n;i++) {
                System.out.println(b[i]);
            }
        }
    }  
}

问题 C: 放苹果

(时间限制: 1 Sec 内存限制: 128 MB)

题目描述:

把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?
(用K表示)5,1,1和1,5,1 是同一种分法。

输入:

每行均包含二个整数M和N,以空格分开。1<=M,N<=10。

输出:

对输入的每组数据M和N,用一行输出相应的K。

样例输入:

7 3

样例输出:

8

参考答案:

import java.util.Scanner;
 
public class Main{
    public static int fangpingguo(int m,int n){
        if(m==0||n==1){
            return 1;
        }
        if(n>m){
            return fangpingguo(m,m);
        }
        return fangpingguo(m,n-1)+fangpingguo(m-n,n);
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int m=sc.nextInt();
            int n=sc.nextInt();
            int s=0;
            s=fangpingguo(m,n);
            System.out.println(s);
        }
    }
}

问题 D: 数字交换

(时间限制: 1 Sec 内存限制: 128MB)

题目描述:

输入一个数n,然后输入n个数值各不相同,调换数组中最大和最小的两个数,然后输出。

输入:

测试数据有多组,输入n(1<=n<=20),接着输入n个数。

输出:

对于每组输入,输出交换后的结果。

样例输入:

2
1 3

样例输出:

3 1

参考答案:

import java.util.Scanner;  
    
public class Main{  
    public static void main(String[] args) {  
        Scanner sc=new Scanner(System.in);  
        while(sc.hasNext()) {
            int n=sc.nextInt();
            int M=0,N=0;
            int a[]=new int[n];
            int Min=0,Max=0,MinIndex=0,MaxIndex=0;
            int temp;
            for(int i=0;i<n;i++) {
                a[i]=sc.nextInt();
            }
            for(int i=0;i<n;i++) {
                if(i==0){
                    Min=a[i];
                    Max=a[i];
                    MinIndex=i;
                    MaxIndex=i;
                }
                if(Max<a[i]){
                    Max=a[i];
                    MaxIndex=i;
                }
                if(Min>a[i]){
                    Min=a[i];
                    MinIndex=i;
                }
            }
            temp=a[MinIndex];
            a[MinIndex]=a[MaxIndex];
            a[MaxIndex]=temp;
            for(int i=0;i<n;i++){
                System.out.print(a[i]);
                if(i !=n-1){
                    System.out.print(" ");
                }
            }
            System.out.println();
        }
    }  
}

问题 E: 棋盘覆盖问题

(时间限制: 1 Sec 内存限制: 256MB)

题目描述:

在一个n×n (n = 2k)个方格组成的棋盘中,恰有一个方格与其他方格不同,称该方格为一特殊方格,且称该棋盘为一特殊棋盘。
在棋盘覆盖问题中,要用图示的4种不同形态的L型骨牌覆盖给定的特殊棋盘上除特殊方格以外的所有方格,且任何2个L型骨牌不得重叠覆盖。

输入:

多组测试用例,每组测试用例包括两部分,
第一部分为方格的宽度n,
第二部分则为方格,特殊方格为-1,其他方格为0。

输出:

输出覆盖后的方案

样例输入:

4
-1 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0

样例输出:

-1 2 4 4
2 2 1 4
3 1 1 5
3 3 5 5

参考答案:

import java.util.Scanner;
 
public class Main {
    static int title=1;
    public static void qipanfugai(int a[][],int tr,int tc,int dr,int dc,int size){ 
        if(size==1)return;
        int t=title++;
        int s=size/2;
        if(dr<tr+s&&dc<tc+s){
            qipanfugai(a,tr,tc,dr,dc,s);
        }else{
            a[tr+s-1][tc+s-1]=t;
            qipanfugai(a,tr,tc,tr+s-1,tc+s-1,s);
        }
        if(dr>=tr+s&&dc<tc+s){
            qipanfugai(a,tr+s,tc,dr,dc,s);
        }else{
            a[tr+s][tc+s-1]=t;
            qipanfugai(a,tr+s,tc,tr+s,tc+s-1,s);
        }
        if(dr<tr+s&&dc>=tc+s){
            qipanfugai(a,tr,tc+s,dr,dc,s);
        }else{
            a[tr+s-1][tc+s]=t;
            qipanfugai(a,tr,tc+s,tr+s-1,tc+s,s);
        }
        if(dr>=tr+s&&dc>=tc+s){
            qipanfugai(a,tr+s,tc+s,dr,dc,s);
        }else{
            a[tr+s][tc+s]=t;
            qipanfugai(a,tr+s,tc+s,tr+s,tc+s,s);
        }
         
    }
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int x = 0,y = 0;
            int n=sc.nextInt();
            int a[][]=new int[n][n];
            for(int i=0;i<n;i++)
                for(int j=0;j<n;j++){
                    a[i][j]=sc.nextInt();
                    if(a[i][j]==-1){
                        x=i;
                        y=j;
                    }
                }       
            qipanfugai(a,0,0,x,y,n);
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++){
                    System.out.print(a[i][j]+" ");
                }
                System.out.println();
            }
            title=1;
        }
    }
}

问题 F: 整数划分问题之备忘录法

(时间限制: 1 Sec 内存限制: 128MB)

题目描述:

使用备忘录法编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。

输入:

多组输入,每一组是一个正整数n。

输出:

输出划分数。

样例输入:

3
4

样例输出:

3
5

参考答案:

import java.util.Scanner;  
    
public class Main {  
    static int a[][]=new int[100][100];
    static int n;
    public static int beiwanglu(int n,int m) {
        if((n<1)||(m<1)) 
            return 0;
        if((n==1)||(m==1)) 
            return 1;
        if(n<m) 
            return beiwanglu(n,n);
        if(n==m){
            if (a[n-1][n-2]==0) {
                a[n-1][n-2] = beiwanglu(n,n-1);
            }
            return 1 + a[n-1][n-2];
        }
        if (n>m) {
            if (a[n-m-1][m-1]==0) {
                a[n-m-1][m-1]=beiwanglu(n-m,m);
            }
            if (a[n-1][m-2]==0) {
                a[n-1][m-2] = beiwanglu(n,m-1);
            }
            return a[n-1][m-2] + a[n-m-1][m-1];
        }else{
            return 0;
        }     
    }
    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  
        while(sc.hasNext()) {
            n=sc.nextInt();
            System.out.println(beiwanglu(n,n));  
        }    
    }     
}
上一篇:分布式事务之seata


下一篇:《我想进大厂》之分布式事务篇