搜狐畅游笔试题:1. 美丽的项链(动态规划) 2.多线程并发交替输出

1. 美丽的项链(动态规划)

1. 题目描述

/**
链接:https://www.nowcoder.com/questionTerminal/e7e0230b12de4239a7f547a01d731522
来源:牛客网

编程题]美丽的项链
妞妞参加了Nowcoder Girl女生编程挑战赛, 但是很遗憾, 她没能得到她最喜欢的黑天鹅水晶项链。
于是妞妞决定自己来制作一条美丽的项链。一条美丽的项链需要满足以下条件:
  1、需要使用n种特定的水晶宝珠
  2、第i种水晶宝珠的数量不能少于li颗, 也不能多于ri颗
  3、一条美丽的项链由m颗宝珠组成
妞妞意识到满足条件的项链种数可能会很多, 所以希望你来帮助她计算一共有多少种制作美丽的项链的方案。


输入描述:
  输入包括n+1行, 第一行包括两个正整数(1 <= n <= 20, 1 <= m <= 100), 表示水晶宝珠的种数和一条美丽的项链需要的水晶宝珠的数量。
  接下来的n行, 每行两个整数li, ri(0 <= li <= ri <= 10), 表示第i种宝珠的数量限制区间。

输出描述:
  输出一个整数, 表示满足限定条件的方案数。保证答案在64位整数范围内。

示例1 输入   3 5   0 3   0 3   0 3 输出   12
*/

2. 代码

二维数组dp[i][j],表示用i+1种宝石选择j个宝石的方案

设d[i][j]表示i+1种宝珠中取j个宝珠的方案数

k表示宝珠个数上限-宝珠个数下限

则d[i][j]=d[i-1][j]+d[i-1][j-1].....+d[i-1][j-k]

例如:当2种宝珠选2个时的方案数

d[1][2]=d[0][2]+d[0][1]+d[0][0](选择从第2种宝珠中取i个时的方案数等于从第1种宝珠中分别取2个,取1个,取0个的和)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int m = sc.nextInt();
        int[][]limit = new int[n][2];
        for(int i=0; i<n;i++){
            limit[i][0] = sc.nextInt();
            limit[i][1] = sc.nextInt();
        }
        long[][]dp = new long[n][m+1];
        for (int i = 0; i < m+1; i++) {
            if(i>=limit[0][0] && i<=limit[0][1]){
                dp[0][i]=1;
            }
        }
        for (int i = 0; i < n; i++) {
            if(limit[i][0] <=0){
                dp[i][0]=1;
            }
        }
        for (int i = 1; i <n; i++) {
            for (int j = 1; j < m+1; j++) {
                dp[i][j] = 0;
                for (int j2 = 0; j2 <= j; j2++) {
                    if(j2+limit[i][1]>=j && limit[i][0]+j2<=j){// li<=(j-j2)<=ri
                        dp[i][j] += dp[i-1][j2];
                    }
                }
            }
        }
        System.out.println(dp[n-1][m]);
    }
}

 2.多线程并发交替输出

1. 题目描述

/**
创建两个线程,其中一个输出1-52,另外一个输出A-Z。输出格式要求:12A 34B 56C 78D 依次类推
*/

2. 代码

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;

public class Main {
    public static void main(String[] args) {
        ReentrantLock lock = new ReentrantLock();
        Condition c1 = lock.newCondition();
        Condition c2 = lock.newCondition();
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    lock.lock();
                    for (int i = 1; i <= 52; i++) {
                        System.out.print(i);
                        if(i%2==0){
                            c1.signalAll();
                            c2.await();
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }finally{
                    lock.unlock();
                }
            }
            
        }).start();
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {
                    lock.lock();
                    for (int i = 0; i < 26; i++) {
                        System.out.print((char)('A'+i)+" ");
                        c2.signalAll();
                        if(i!=25){
                            c1.await();
                        }
                    }
                } catch (Exception e) {
                    // TODO: handle exception
                }finally{
                    lock.unlock();
                }
            }
            
        }).start();
    }
}
原文地址:https://www.cnblogs.com/haimishasha/p/11587554.html