【问题描述】
有n个某种商品供应商,某地有m个商店,商店需要从供应商那里进货该商品,每个供应商的供应能力有上限,每个商店都有自己的商品需求量(need[i]:表示第i个商店的需求),每个供应商运送单位商品到商店需要一个运费。
【输入形式】
输入说明:第一行包含两个整数N,M
接下来N行包含三个整数,第一个数表示供应商编号,第二数表示供应能力上限,表示该供应商的供应量不能超过这个上限,第三个数表示运送单位商品到商店的运费。
接下来M行包含两个整数,第一个数表示商店编号,第二个数表示某种商品的需求量。
【输出形式】
输出说明:若可以满足所有商店需求,则输出格式如下:每行第一个数表示供应商编号,第二个数为商店编号,第三个数为供应量。
如:1 2 20
表示第1个供应商给第2个商店供应20个单位量的商品
按商店编号顺序,输出所有供应路径(最后一行无换行符)。
若不满足,输出-1
【样例输入】
4 4
0 20 8
1 15 3
2 55 6
3 40 10
0 28
1 36
2 49
3 12
【样例输出】
1 0 15
2 0 13
2 1 36
2 2 6
0 2 20
3 2 23
3 3 12
【Java代码实现】
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;
public class OG3_5 {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int sum1 = 0; //总供应量
int sum2 = 0; //总需求量
int[][] supplier = new int[n][3];
int[][] need = new int[m][2];
for (int i = 0; i < n; i++) {
supplier[i][0] = input.nextInt(); //供应商ID
supplier[i][1] = input.nextInt(); //供应能力
supplier[i][2] = input.nextInt(); //运费
sum1 += supplier[i][1];
}
// 通过Araays.sort实现多维数组的排序
Arrays.sort(supplier, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] - o2[2];
}
});
for (int i = 0; i < m; i++) {
need[i][0] = input.nextInt(); //商店ID
need[i][1] = input.nextInt(); //商店需求量
sum2 += need[i][1];
}
if (sum1 < sum2) {
System.out.print(-1);
} else {
int i = 0, j = 0;
while (sum2 != 0) {
// 第i个供应商满足第j个商店需求,对下一个商店进行供给(j++)
if (supplier[i][1] >= need[j][1]) {
System.out.println(supplier[i][0] + " " + need[j][0] + " " + need[j][1]);
supplier[i][1] -= need[j][1];
sum2 -= need[j][1];
j++;
//第i个供应商恰好满足商店需求,换下一家供应商进行供给
if (supplier[i][1] == 0) {
i++;
}
} else { //第i个供给商不满足第j个商店需求,换下一家供应商进行供给
System.out.println(supplier[i][0] + " " + need[j][0] + " " + supplier[i][1]);
need[j][1] -= supplier[i][1];
sum2 -= supplier[i][1];
i++;
}
}
}
}
}