2021.06.02税收和补贴问题
(题目来源:洛谷-P1023)
题目描述
每样商品的价格越低,其销量就会相应增大。现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递减。(我们假设价格及销售量都是整数)
对于某些特殊商品,不可能完全由市场去调节其价格。这时候就需要政府以税收或补贴的方式来控制。(所谓税收或补贴就是对于每个产品收取或给予生产厂家固定金额的货币)
输入格式
输入的第一行为政府对某种商品的预期价,第二行有两个整数,第一个整数为商品成本,第二个整数为以成本价销售时的销售量,以下若干行每行都有两个整数,第一个为某价位时的单价,第二个为此时的销量,以一行-1,-1表示所有已知价位及对应的销量输入完毕,输入的最后一行为一个单独的整数表示在已知的最高单价外每升高一块钱将减少的销量。
输出格式
输出有两种情况:若在政府预期价上能得到最大总利润,则输出一个单独的整数,数的正负表示是补贴还是收税,数的大小表示补贴或收税的金额最小值。若有多解,取绝对值最小的输出。
样例输入
31
28 130
30 120
31 110
-1 -1
15
样例输出
4
数据规模和约定
思路
1.初看本题,不解题意。
2.当不解题意时,一定要用excel模拟样例!
可见,政府补贴会使价格下降。
代码
class Solution{
static int cost = 0;
void test() { //m售价 s销量 c控制
Scanner cin = new Scanner(System.in);
//如遇到题目难以理解,用excel进行模拟!!
int tar = cin.nextInt(); int ds = 0;
ArrayList<Temp> lis = new ArrayList<Temp>();
Temp head = new Temp(cin.nextInt(), cin.nextInt()); lis.add(head);
cost = head.money;
while(true) {
int m = cin.nextInt();
int s = cin.nextInt();
if(m == -1 && s == -1) break;
lis.add(new Temp(m,s));
}
int dec = cin.nextInt(); //超过后销量的下降值
while(true) { //如果目标值大于当前最大值
Temp cur = lis.get(lis.size()-1);
if(cur.money >= tar) break;
lis.add(new Temp(cur.money+1,cur.sales-dec));
}
int c = 0; //政府的干预值
while(true) {
int max = 0, maxInd = 0;
for(int i = 0; i < lis.size(); i++) {
lis.get(i).setCon(c);
if(max < lis.get(i).getY()) {
max = lis.get(i).getY();
maxInd = i;
}
}
//找到了最大利润的坐标
if(maxInd == lis.size()-1) { //如果位于右边界
Temp cur = lis.get(lis.size()-1);
Temp nt = new Temp(cur.money+1, cur.sales-dec);
nt.setCon(c);
lis.add(nt);
continue;
} else { //如果位于左边界
}
if(lis.get(maxInd).money == tar) { //如果已是期望的价格
System.out.println(c);
return;
} else { //政府补贴导致价格下降, 政府收税导致价格上升
if(lis.get(maxInd).money > tar) c++;
else c--;
}
}
}
}
class Temp{
int money, sales;
int con;
void setCon(int c) {
con = c;
}
public Temp(int money, int sales) {
super();
this.money = money;
this.sales = sales;
}
int getY() {
return (money+con-Solution.cost)*sales;
}
}