题意理解
我本来想枚举一波的,结果发现好难写啊。
还有我写的是一个假算法,我是想这个预期价格可能是开口向下二次函数的中间点,只要比左右两个临界点都大就好了。但是我感觉如果数据出的针对性强一些,这个可能就过不掉了。。。
题意有点难懂,是说,在政府期望价格时,要能获得最高利润,问这时候补贴/收税应该是多少。对于给定的价格,我们是可以计算出或者直接从题目给的数据中获取销量的。
注意我写的是假算法!!!
代码
import java.util.Map;
import java.util.Scanner;
import java.util.TreeMap;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int gov = scanner.nextInt(); // 政府预期价格
int cost, costNum; // 成本价,按成本价出售时的数量
cost = scanner.nextInt();
costNum = scanner.nextInt();
Map<Integer, Integer> priceNum = new TreeMap<>();
priceNum.put(cost, costNum);
int price, num;
int prev = gov - 1;
int succ = gov + 1;
while (true) {
price = scanner.nextInt();
num = scanner.nextInt();
if (price == -1 && num == -1) {
break;
}
int k = (costNum - num) / (price - cost);
if (cost <= gov && gov <= price) {
priceNum.put(gov, num + (price - gov) * k);
}
if (cost <= prev && prev <= price) {
priceNum.put(prev, num + (price - prev) * k);
}
if (cost <= succ && succ <= price) {
priceNum.put(succ, num + (price - succ) * k);
}
cost = price;
costNum = num;
}
int k = scanner.nextInt();
if (cost < prev) {
priceNum.put(prev, costNum + k * (cost - prev));
}
if (cost < gov) {
priceNum.put(gov, costNum + k * (cost - gov));
}
if (cost < succ) {
priceNum.put(succ, costNum + k * (cost - succ));
}
int min = 0;
for (int i : priceNum.keySet()) {
min = i;
break;
}
for (int i = 0;; i++) {
int a = (prev - min + i) * priceNum.get(prev);
int b = (gov - min + i) * priceNum.get(gov);
int c = (succ - min + i) * priceNum.get(succ);
if(a <= b && b >= c) {
System.out.println(i);
scanner.close();
return;
} else if(a > b) {
break;
}
}
for (int i = -1;; i--) {
int a = (prev - min + i) * priceNum.get(prev);
int b = (gov - min + i) * priceNum.get(gov);
int c = (succ - min + i) * priceNum.get(succ);
if(a <= b && b >= c) {
System.out.println(i);
scanner.close();
return;
}
}
}
}
欢迎加入“不会算法一群菜鸟”,群号是⑥⑥①⑨②2025,这是我设置的一道很低的门槛用来阻止广告的。入群的验证暗号是:我爱编译原理