第一题
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
Map<Integer, Integer> m = new HashMap<Integer, Integer>();
System.out.println("请输入第一行:");
Scanner s = new Scanner(System.in);
String first = s.nextLine();
String[] line1 = first.split(" ");
int n = Integer.parseInt(line1[0]);// 时间段数
int p1 = Integer.parseInt(line1[1]);
int p2 = Integer.parseInt(line1[2]);
int p3 = Integer.parseInt(line1[3]);
int t1 = Integer.parseInt(line1[4]);
int t2 = Integer.parseInt(line1[5]);
System.out.println("请输入时间段:");
String str1;
int[] arr = new int[2 * n];
for (int i = 0; i < n; i++) {
Scanner s1 = new Scanner(System.in);
str1 = s1.nextLine();
if (!str1.equals("")) {
String[] str = str1.split(" ");
int from = Integer.parseInt(str[0]);
int to = Integer.parseInt(str[1]);
m.put(from, to);
arr[2 * i] = from;
arr[2 * i + 1] = to;
}
//s1.close() 这个地方不能调用s1.close()方法,这个方法在关闭流的同时还会关闭system.in
}
s.close();
int count = computer(m, p1, p2, p3, t1, t2);
System.out.println("常规时间耗电量:" + count);// 这个是对的
for (int i = 1,j=1; i < arr.length - 1; i=i+2,j++) {
int cha = arr[i + 1] - arr[i];
System.out.println("第" + j + "阶段时间差为:" + cha);
if (cha <= t1) {
count += (cha * p1);
System.out.println("*第" + j + "个时段:" + count);
} else if (t1 < cha && cha <= t1 + t2) {
count += (t1 * p1 + (cha - t1) * p2);
System.out.println("**第" + j + "个时段:" + count);
} else if (cha > t1 + t2) {
count += (t1 * p1 + t2 * p2 + (cha - t1 - t2) * p3);
System.out.println("***第" + j + "个时段:" + count);
}
}
System.out.println("总耗电量:" + count);
}
public static int computer(Map<Integer, Integer> m, int p1, int p2, int p3, int t1, int t2) {
int sum = 0;
Set<Entry<Integer, Integer>> s = m.entrySet();
Iterator<Entry<Integer, Integer>> it = s.iterator();
while (it.hasNext()) {// 正常工作总耗电
Entry<Integer, Integer> en = it.next();
sum += ((Integer) en.getValue() - (Integer) en.getKey()) * p1;
}
return sum;
}
}
测试结果
有时不是不会做,而是时间不够用啊!还是怪自己不够熟练吧。。。
这道题挺简单的,就像是高中时候学的分段函数一样,不同的情况采用不同的计算方式。遇到一个知识点,就是当有多个scanner实例时,应该在执行完全部输入后再调用close()方法关闭流。因为close()方法还会关闭System.in,这样后面如果再调用scanner的话,就会报错:java.util.NoSuchElementException: No line found
第二题
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s1 = new Scanner(System.in);
int num = s1.nextInt();
Scanner s2 = new Scanner(System.in);
String[] str = s2.nextLine().split(" ");
s1.close();
s2.close();
int len = str.length;
if(len == num){
int [] value = new int[len];
for(int i=0;i<len;i++){
value[i] = Integer.parseInt(str[i]);
}
System.out.println(computer(value));
}else{
System.out.println("输入数据有误!");
}
}
public static int computer(int[] str){
int count = 0;
int len = str.length;
int min,max;
for(int i=0;i<len-1;i++){
if(str[i]>=str[i+1]){
max = str[i];
min = str[i+1];
}else{
min = str[i];
max = str[i+1];
}
for(int j=i+1;j<len;j++){
if(str[j]>=max){
max = str[j];
count+=(max - min);
}else if(str[j]<=min){
min = str[j];
count+=(max - min);
}else{
count+=(max - min);
}
}
}
return count;
}
}
测试结果
这题也比较简单,用了两个循环。外层循环确定起始点以及最大最小值,内层循环用来遍历起点之后的元素,并判断最大最小值。
第三题
这题看了一眼,没思路。。。哪位大神会的还请指教一下!小弟感激不尽!