题目描述:小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
小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);
}
}
上述求解方式纯属个人理解,如有考虑不周,还望大家多多指出!谢谢!