1319: Sec_Wed和Rache(2014年ACM校赛初赛)
题目描述
Rache他突然间想经商,他收购一些货物,每件货物都有价值和保质期,每天可以卖一件货物,做为ACMer的他,要做出一个程序出来,算出他这些货物卖出的最大价值的啦。
其中pi为货物的价值,di为货物的保质期。
比如Rache拥有货物=={a,b,c,d},和(pa,da)=(50,2), (pb,db)=(10,1), (pc,dc)=(20,2), and (pd,dd)=(30,1),如图所以是这些货物所有可能的出售计划, 货物b和d都是一天,所以Rache只能第一天卖d货物,然后第二天只能选取a货物,所以Rache得到80元。
输入
输入包含多个测试数据,以判断输入到达文件为(EOF)终止程序。 第一行输入0 <= n <= 10000(表示有N件货物),紧接着是货物的价值和这货物的保质期。
1 <= pi <= 10000 and 1 <= di <= 10000。
输出
每个样例输出一行,输出最大获得利润值。
样例输入
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3 100 2 8 2 5 20 50 10
样例输出
80
185
思路: 货物保质期越小优先级越高,同等级下, 取货物价值最高的,直至遍历完就是最大价值
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void out(){
Scanner in = new Scanner(System.in);
while(in.hasNext()) {
int n = in.nextInt();
int [][]num = new int[n][2];
int di[] = new int[n];
int k=0;
for (int i = 0; i < n; i++) {
for (int j = 0; j < 2; j++) {
num[i][j] = in.nextInt();
if (j==1) {
di[k++] = num[i][j];
}
}
}
//
Arrays.sort(di);
int temp=0,sum=0,value=0;
for (int i = 0; i < di.length; i++) {
if(di[i] <= temp) {
continue;
}
temp = di[i];
for (int j = 0; j < n; j++) {
if(num[j][1]==temp && num[j][0]>value) {
value = num[j][0];
}
}
sum+=value;
value=0;
}
System.out.println(sum);
}
}
public static void main(String[] args){
out();
}
}