全错!
import java.util.Scanner;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Comparator;
public class Main{
public static void main(String [] args) throws IOException{
Scanner in = new Scanner(new File("./in.txt"));
// Scanner in = new Scanner(System.in);
int i, n;
int [] p = new int[24]; //cents/minute
for(i = 0; i < 24; i++){
p[i] = in.nextInt();
}
n = in.nextInt();
String month = null;//For each test case, all dates will be within a single month
//PriorityQueue only assure the head is the smallest, can't assure all elements are in ascending order!
PriorityQueue<String> Qnames = new PriorityQueue<String>(); //for customer name
Comparator<String> cmpCall = new Comparator<String>(){ //compare record by time
public int compare(String s1, String s2){
// String d1 = s1.substring(3,5); //day
// String d2 = s2.substring(3,5);
// String h1 = s1.substring(6,8); //hour
// String h2 = s2.substring(6,8);
// String m1 = s1.substring(9,11); //min
// String m2 = s2.substring(9,11);
//
// if(d1.compareTo(d2) != 0){
// return d1.compareTo(d2);
// }else if(h1.compareTo(h2) != 0){
// return h1.compareTo(h2);
// }else if(m1.compareTo(m2) != 0){
// return m1.compareTo(m2);
// }
// return 0;
return s1.substring(3,11).compareTo(s2.substring(3,11));
}
};
HashMap<String, PriorityQueue<String>> callRecords = new HashMap<String, PriorityQueue<String>>();//customer
// mapping with all his call records
while(n-- > 0){ //put all n records into callRecords
//so they are sorted by customer name and time respectively
String name = in.next();
String time = in.next();
String type = in.next();
if(callRecords.containsKey(name)){
callRecords.get(name).add(time+type);
}else{
Qnames.add(name); //add customer name
if(month == null){
month = time.substring(0,2);
}
PriorityQueue<String> Q = new PriorityQueue<String>(11,cmpCall);
Q.add(time+type);
callRecords.put(name , Q);
}
}
//test
// while(!Qnames.isEmpty()){
// String name = Qnames.poll();
// System.out.println(name+" "+month);
//
// PriorityQueue<String> Q = callRecords.get(name);
// while(!Q.isEmpty()){
// System.out.println(Q.poll());
// }
// }
while(!Qnames.isEmpty()){
String name = Qnames.poll();
StringBuilder res = new StringBuilder();//if no bill, nothing output even the customer name!
res.append(name+" "+month+"\n");//print name and month
PriorityQueue<String> Q = callRecords.get(name);
List<String> lsCallTime = new ArrayList<String>();//get a ascending order of records time
List<String> lsCallType = new ArrayList<String>();//respective type: on or off
while(!Q.isEmpty()){
String record = Q.poll();
lsCallTime.add(record.substring(0,11));
lsCallType.add(record.substring(11));
}
//test
// System.out.println(lsCallType);
i = 0;
double [] totalAmount = new double[1];
totalAmount[0] = 0;
while(i < lsCallTime.size()){
String onTime = null, offTime = null;
while(i < lsCallTime.size() && lsCallType.get(i).equals("off-line")){//find first on-line
i++;
}
while(i < lsCallTime.size() && lsCallType.get(i).equals("on-line")){//find the last on-line
onTime = lsCallTime.get(i);//t
i++;
}
if(i < lsCallTime.size() ){//the nearest off-line as offTime
offTime = lsCallTime.get(i);
}
if(onTime != null && offTime != null){
onTime = onTime.substring(3);
offTime = offTime.substring(3);
res.append(onTime+" "+offTime+" "+calculate(p, onTime, offTime, totalAmount)+"\n");
}
i++;
}
if (totalAmount[0] > 0){
res.deleteCharAt(res.length()-1);
System.out.println(res.toString());
String strTotalAmount = String.format("$%.2f", totalAmount[0]);
System.out.println("Total amount: "+strTotalAmount);
}
}
}
public static String calculate(int [] p, String onTime, String offTime, double [] totalAmount){
double res = 0.0;
int minCount = 0;
int d1 = Integer.parseInt(onTime.substring(0,2)); //day
int d2 = Integer.parseInt(offTime.substring(0,2));
int h1 = Integer.parseInt(onTime.substring(3,5)); //hour
int h2 = Integer.parseInt(offTime.substring(3,5));
int m1 = Integer.parseInt(onTime.substring(6,8)); //min
int m2 = Integer.parseInt(offTime.substring(6,8));
int dayDiff = d2 - d1;
int hourDiff = h2 - h1;
int minDiff = m2 - m1;
double oneDayPrice = 0.0;
int i;
for(i = 0; i < 24; i++){
oneDayPrice += p[i] * 60;
}
if(dayDiff == 0){
if(hourDiff == 0){
res += minDiff * p[h1];
minCount += minDiff;
}else{ // h2 > h1
res += (60 - m1) * p[h1];//mins left in h1
minCount += (60 - m1);
h1++;
while(h1 < h2){
res += 60 * p[h1];
minCount += 60;
h1++;
}
res += m2 * p[h2]; // minDiff may be negative ,just to remove overadded
minCount += m2;
}
}else{
res += (60 - m1) * p[h1];
minCount += (60 - m1);
for(i = h1+1; i < 24; i++){//hours left in d1
res += 60 * p[i];
minCount += 60;
}
d1++;
while(d1 < d2){
res += oneDayPrice;
minCount += 24*60;
d1++;
}
for(i = 0; i < h2; i++){//hours on d2 before h2
res += 60 * p[i];
minCount += 60;
}
res += m2 * p[h2];
minCount += m2;
}
res = res/100;
totalAmount[0] += res;//total amount for each customer
String strAmount = String.format("$%.2f", res);
return minCount+" "+strAmount;
}
}