java常见算法

1.

题目描述

有一个 n \times mn×m 方格的棋盘,求其方格包含多少正方形、长方形(不包含正方形)。

输入格式

一行,两个正整数 n,mn,m(n \leq 5000,m \leq 5000n≤5000,m≤5000)。

输出格式

一行,两个正整数,分别表示方格包含多少正方形、长方形(不包含正方形)。

输入输出样例

输入 #1复制

2 3

输出 #1复制

8 10
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        long n = scanner.nextInt();
        long m = scanner.nextInt();
        long zh = 0;
        long sh = 0;

        for (int i = 0; i < n; i++) {

            for (int j = 0; j < m; j++) {

                if (i == j) {

                    zh += (n - i) * (m - j);
                }else

                    sh += (n - i) * (m - j);
            }
        }

        System.out.println(zh+" "+sh);
    }
}

2.

题目描述

猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 1010 种配料(芥末、孜然等),每种配料可以放 11 到 33 克,任意烤鸡的美味程度为所有配料质量之和。

现在, Hanke 想要知道,如果给你一个美味程度 nn ,请输出这 1010 种配料的所有搭配方案。

输入格式

一个正整数 nn,表示美味程度。

输出格式

第一行,方案总数。

第二行至结束,1010 个数,表示每种配料所放的质量,按字典序排列。

如果没有符合要求的方法,就只要在第一行输出一个 00。

输入输出样例

输入 #1复制

11

输出 #1复制

10
1 1 1 1 1 1 1 1 1 2 
1 1 1 1 1 1 1 1 2 1 
1 1 1 1 1 1 1 2 1 1 
1 1 1 1 1 1 2 1 1 1 
1 1 1 1 1 2 1 1 1 1 
1 1 1 1 2 1 1 1 1 1 
1 1 1 2 1 1 1 1 1 1 
1 1 2 1 1 1 1 1 1 1 
1 2 1 1 1 1 1 1 1 1 
2 1 1 1 1 1 1 1 1 1 
import java.util.Scanner;

public class Main {

    private static String[] arr = new String[10005];
    private static int ans = 0;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();

        dfs(10,0,"",n);
        System.out.println(ans);

        for (int i = 0; i < ans; i++) {

            for (int j = 0; j < arr[i].length(); j++) {

                if (j == arr[i].length() - 1)
                    System.out.print(arr[i].charAt(j));
                else
                    System.out.print(arr[i].charAt(j) + " ");
            }
            System.out.println();
        }

    }

    private static void dfs(int count,int sum,String s,int n) {

        if (count == 0) {

            if (sum == n) {

                arr[ans++] = s;
            }
            s = "";
            return;
        }

        dfs(count-1,sum+1,s+"1",n);
        dfs(count-1,sum+2,s+"2",n);
        dfs(count-1,sum+3,s+"3",n);
    }
}

3.

题目描述

将 1, 2,\ldots, 91,2,…,9 共 99 个数分成三组,分别组成三个三位数,且使这三个三位数的比例是 A:B:CA:B:C,试求出所有满足条件的三个三位数,若无解,输出 No!!!

//感谢黄小U饮品完善题意

输入格式

三个数,A,B,CA,B,C。

输出格式

若干行,每行 33 个数字。按照每行第一个数字升序排列。

输入输出样例

输入 #1复制

1 2 3

输出 #1复制

192 384 576
219 438 657
273 546 819
327 654 981
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);

        int a = scanner.nextInt();
        int b = scanner.nextInt();
        int c = scanner.nextInt();

        int f = 0;
        for (int i = 123; i < 999; i++) {

            int m1 = i;
            int m2 = i / a * b;
            int m3 = i / a * c;

            if (m2 >= 999 || m3 >= 999)
                break;
            if (m1 > m2 || m1 > m3 || m2 > m3)
                break;

            if (isC(String.valueOf(m1),String.valueOf(m2),String.valueOf(m3))) {

                if (isSuccess(a,b,c).equals(isSuccess(m1,m2,m3))) {

                    f = 1;
                    System.out.println(a + " " + b + " "+ c);
                }
            }
        }

        if (f == 0)
            System.out.println("No!!!");
    }
    public static String isSuccess(int a,int b,int c) {

        for (int i = a; i >= 2; i--) {

            if (a % i == 0 && b % i == 0 && c % i == 0) {

                a /= i;
                b /= i;
                c /= i;
            }
        }
        return String.valueOf(a)+String.valueOf(b)+String.valueOf(c);
    }

    public static boolean isC(String a,String b,String c) {

        String arr = a + b + c;
        for (char i = '1'; i <= '9'; i++) {

            if (!arr.contains(String.valueOf(i)));
            return false;
        }

        return true;
    }
}

4.

题目描述

排列与组合是常用的数学方法,其中组合就是从nn个元素中抽出rr个元素(不分顺序且r \le n)r≤n),我们可以简单地将nn个元素理解为自然数1,2,…,n1,2,…,n,从中任取rr个数。

现要求你输出所有组合。

例如n=5,r=3n=5,r=3,所有组合为:

12 3 , 1 2 4 , 1 2 5 , 1 3 4 ,1 3 5 , 1 4 5 , 2 3 4 , 2 3 5 , 2 4 5 , 3 4 5123,124,125,134,135,145,234,235,245,345

输入格式

一行两个自然数n,r(1<n<21,0 \le r \le n)n,r(1<n<21,0≤r≤n)。

输出格式

所有的组合,每一个组合占一行且其中的元素按由小到大的顺序排列,每个元素占三个字符的位置,所有的组合也按字典顺序。

**注意哦!输出时,每个数字需要33个场宽,pascal可以这样:

write(ans:3);

输入输出样例

输入 #1复制

5 3 

输出 #1复制

  1  2  3
  1  2  4
  1  2  5
  1  3  4
  1  3  5
  1  4  5
  2  3  4
  2  3  5
  2  4  5
  3  4  5
import java.util.Scanner;

public class Main {

    private static int n;
    private static int r;
    private static int[] arr;

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        r = scanner.nextInt();
        arr = new int[n];

        backTrink(n,0,1);
    }

    public static void backTrink(int n,int count,int index) {

        if (count == r) {

            for (int i = 0; i < r; i++) {

                System.out.printf("%3d",arr[i]);
            }
            System.out.println();
            return;
        }

        for (int i = index; i <= n; i++) {

            arr[count] = i;
            backTrink(n,count+1,i+1);
            arr[count] = 0;
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海边的彩虹与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值