牛牛们吃糖果—【2021】阿里巴巴编程题(4星)

问题描述:

个牛牛一起去朋友家吃糖果,第个牛牛一定要吃块糖果. 

而朋友家一共只有块糖果,可能不会满足所有的牛牛都吃上糖果。 

同时牛牛们有个约定,每一个约定为一个牛牛的编号对,表示第个和第个牛牛是好朋友,他俩要么一起都吃到糖果,要么一起都不吃。 

保证每个牛牛最多只出现在一个编号对中。

您可以安排让一些牛牛吃糖果,一些牛牛不吃。 

要求使能吃上糖果的牛牛数量最多(吃掉的糖果总量要小于等于),并要满足不违反牛牛们的个约定。


输入示例:
3 10
5 1 5
1 3

输出示例:
2

实现代码:
java实现
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        // n 个牛牛
        int n = sc.nextInt();
        // m 颗糖果
        int m = sc.nextInt();
        // 每个牛牛吃到的糖果 a[i]
        int[] a = new int[n];
        for (int i = 0; i < a.length; i++) {
            a[i] = sc.nextInt();
            if (a[i] < 1 || a[i] > 1000000) {
                return;
            }
        }
        int[] v = new int[a.length];
        Arrays.fill(v, 1);
        // k 个约定
        int k = sc.nextInt();
        //第 i 个牛牛与第 j 个牛牛有约定  
        for (int i = 0; i < k; i++) {
            int x = sc.nextInt();
            int y = sc.nextInt();
            a[x - 1] += a[y - 1];
            v[x - 1] += 1;
            v[y - 1] = 0;
        }
        int[] opt = new int[m + 1];
        Arrays.fill(opt, 0);
        for (int i = 0; i < n; i++) {
            if (v[i] == 0) {
                continue;
            }
            for (int j = m; j > a[i] - 1; --j) {
                opt[j] = Math.max(opt[j], (opt[j - a[i]] + v[i]));
            }
        }
        //最多能吃到糖果的牛牛个数
        System.out.print(opt[opt.length - 1]);
    }
}
还没有优化,欢迎大家指教😄
#2021届秋招进度交流##阿里巴巴##笔经#
全部评论

相关推荐

01-29 15:45
已编辑
华中科技大学 前端工程师
COLORSN:可以试一下,小厂看技术栈是不是很落后,如果太拉胯就别去,个人认为有实习氛围比你自己琢磨要高效不少,然后就是小厂其实也有可能会问的很难,这都比较难说,还是看自己项目含金量够不够,寒假还能不能推进学习再选择,毕竟去实习过年就10天假了
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务