2018腾讯实习招聘笔试编程题之安排机器

题目描述:小Q的公司最近接到m个任务,第i个任务需要Xi的时间去完成,难度等级为yi。
                小Q拥有n台机器,每台机器最长工作时间zi,机器等级wi。
               对于一个任务,它只能交由一台机器来完成,如果安排给它的机器的最长工作时间小于任务需要的时间,则不能完成,
                如果完成这个任务将获得200*xi + 3*yi收益。
                对于一台机器,它一天只能完成一个任务,如果它的机器等级小于安排给它的任务难度等级,则不能完成。
               小Q想在今天尽可能的去完成任务,即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。
           输入描述:输入包括 N + M + 1行
                 输入的第一行为两个正整数n和m(1 <= n, m <= 100000),表示机器的数量和任务的数量。
                 接下来n行,每行两个整数zi和wi(0 < zi < 1000, 0 <= wi <= 100),表示每台机器的最大工作时间和机器等级。
                 接下来的m行,每行两个整数xi和yi(0 < xi < 1000, 0 <= yi <= 100),表示每个任务需要的完成时间和任务的难度等级。
           输出描述:输出两个整数,分别表示最大能完成的任务数量和获取的利益。
           输入: 1 2
               100 3
               100 2
               100 1

           输出:1 20006

package com.study;

import java.util.Scanner;

/** 
* @author ZhaoFang 
* @date 2018年4月5日 下午9:18:17 
* @describe 安排机器:小Q的公司最近接到m个任务,第i个任务需要Xi的时间去完成,难度等级为yi。
*                 小Q拥有n台机器,每台机器最长工作时间zi,机器等级wi。
*                 对于一个任务,它只能交由一台机器来完成,如果安排给它的机器的最长工作时间小于任务需要的时间,则不能完成,
*                 如果完成这个任务将获得200*xi + 3*yi收益。
*                 对于一台机器,它一天只能完成一个任务,如果它的机器等级小于安排给它的任务难度等级,则不能完成。
*                 小Q想在今天尽可能的去完成任务,即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。
*           输入描述:输入包括 N + M + 1行
*                 输入的第一行为两个正整数n和m(1 <= n, m <= 100000),表示机器的数量和任务的数量。
*                 接下来n行,每行两个整数zi和wi(0 < zi < 1000, 0 <= wi <= 100),表示每台机器的最大工作时间和机器等级。
*                 接下来的m行,每行两个整数xi和yi(0 < xi < 1000, 0 <= yi <= 100),表示每个任务需要的完成时间和任务的难度等级。
*           输出描述:输出两个整数,分别表示最大能完成的任务数量和获取的利益。
*           输入: 1 2
*               100 3
*               100 2
*               100 1
*           输出:1 20006
*/
public class Tencent3 {
	
	public static void main(String[] args) {
			
	        Scanner in = new Scanner(System.in);
	        
	        int n = in.nextInt();//机器的数量
	        int m = in.nextInt();//任务的数量
	        
	        if(n < 1 || n > 100000 || m < 1 || m > 100000) 
	        	return;
	        
	        int[] z = new int[n];//机器的最大工作时间数组
	        int[] w = new int[n];//机器等级数组
	        
	        int[] x = new int[m];//任务需要的完成时间数组
	        int[] y = new int[m];//任务的难度等级数组
	        
	        int temp1 = 0;
	        int temp2 = 0;
	        
	        //输入每台机器的最大工作时间和机器等级
	        for(int i = 0; i < n; i++) {
	        	temp1 = in.nextInt();
	        	temp2 = in.nextInt();
	        	
	        	if(temp1 > 0 && temp1 < 1000 && temp2 >= 0 && temp2 <= 100) {
	        		z[i] = temp1;
	        		w[i] = temp2;
	        	}
	        }
	        
	        //输入每个任务需要的完成时间和任务的难度等级
	        for(int j = 0; j < m; j++) {
	        	temp1 = in.nextInt();
	        	temp2 = in.nextInt();
	        	
	        	if(temp1 > 0 && temp1 < 1000 && temp2 >= 0 && temp2 <= 100) {
	        		x[j] = temp1;
	        		y[j] = temp2;
	        	}
	        }
	        
	        int cost = 0;//获取的收益
	        int count = 0;//最大能完成的任务数量
	        int p = -1;//设置标志,如果机器与任务都相匹配,选出收益最大,并保证该任务只被一个机器完成,且一台机器每天只能完成一个任务
	        int q = -1;
	        
	        //解题难点:存在一个机器适用于多种任务的情况,此时需选出收益最大的那个任务,并将完成的任务数量+1
	        
	        for(int i = 0; i < n; i++) {
	        	for(int j = 0; j < m; j++) {
	        		if(z[i] >= x[j] && w[i] >= y[j]) {
	        			temp1 = 200*x[j] + 3*y[j];
	        			if(temp1 > cost) {
	        				cost = temp1;
	        			}
	        			if(p != i && q != j) {
	        				p = i;
	        				q = j;
	        				count++;
	        			}
	        		}
	        	}
	        }
	        
	        System.out.println("最大能完成的任务数量为:" + count);
	        System.out.println("获取的利益:" + cost);
	}
}
上述求解方式纯属个人理解,如有考虑不周,还望大家多多指出!谢谢!
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值