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

二次信任 提交于 2019-11-30 12:32:24

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

1. 题目描述

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

输入:
3 5
0 3
0 3
0 3
输出
12
*/

2. 代码

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

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){
                        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();
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!