阿里巴巴笔试 3.17

第一题
t组数据
n副牌 每副m张 求每一组选一张,使得和为k,有多少种情况?
第二题---这个代码过70%
n个零件 m个冲突
每一个零件有对应的时间空间优化a[i],b[i]
m个冲突关系,使得零件之间不能一起选
求,每个零件和其他所有零件组合的开销的总最小值。
5 3
-1 3
2 4
1 1
3 5
2 2
1 4
2 3
3 5
4 14 4 16 10
 / 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
    //    static int ans = 0;
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int T = cin.nextInt();
        List<Integer> res = new ArrayList<>();
        for(int i=0;i<T;i++){
            int n = cin.nextInt();
            int m = cin.nextInt();
            int k = cin.nextInt();
//            get_ans(n, m, k);
            res.add(get_ans(n, m, k));
        }
        for (int i=0;i<T;i++){
            System.out.println(res.get(i));
        }
    }
    public static int get_ans(int n, int m, int k){
        int res = 0;
        long [][]dp = new long[n+1][k+1];
        for(int j=1;j<=m && j<=k;j++){
            dp[1][j] = 1;
//            System.out.println(1 + " " + j + " " + dp[1][j]);
        }
        for(int i=2;i<=n;i++){
            for(int j=i;j<=k;j++){
                for(int c = 1;c<=m;c++){
                    if(j - c < 1)
                        break;
                    dp[i][j] += dp[i-1][j-c];
//                    System.out.println(i + " " + j + " " + dp[i][j]);
                }
            }
        }
        return (int)(dp[n][k] % 1000000007);
    }
// 本题为考试单行多行输入输出规范示例,无需提交,不计分。
import java.util.*;

public class Main {
//    static int ans = 0;
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        int n = cin.nextInt();
        int m = cin.nextInt();
        List<Integer> lint = new ArrayList<>();
        int []a = new int[n+1];
        int []b = new int[n+1];
        for(int i=1;i<=n;i++){
            a[i] = cin.nextInt();
            b[i] = cin.nextInt();
        }
        char [][]relation = new char[n+1][n+1];
        for (int i=0;i<m;i++){
            int x = cin.nextInt();
            int y = cin.nextInt();
            relation[x][y] = '1';
            relation[y][x] = '1';

        }
        int res;
        for(int i=1;i<=n;i++){
            res = 0;
            for(int j=1;j<=n;j++){
                if (i == j || relation[i][j] == '1')
                    continue;
                res += Math.min(a[i]+b[j], a[j] + b[i]);
            }
            lint.add(res);
        }
        for (int i=0;i<lint.size();i++){
            System.out.print(lint.get(i) + " ");
        }
    }
}




#笔经##阿里巴巴##Java#
全部评论
第1题就是个01背包 复杂度到了9e8都能100%我也是没想到
点赞 回复 分享
发布于 2021-03-17 10:15
请问第二道题,这个代码能全过吗?
点赞 回复 分享
发布于 2021-03-17 10:33
第二题过70%,内存溢出了
点赞 回复 分享
发布于 2021-03-17 10:36
第二题排序加前缀和就可以过了
点赞 回复 分享
发布于 2021-03-17 14:39
对于a-b的大小排序
点赞 回复 分享
发布于 2021-03-17 14:39

相关推荐

蚂蚁 基架java (n+6)*16 签字费若干
点赞 评论 收藏
分享
10-22 19:18
上海大学 后端
jopajhhdjwnqk:水印都叠杀人书了
点赞 评论 收藏
分享
评论
3
16
分享
牛客网
牛客企业服务