【题解】税收与补贴问题

算是一周前的一个坑了吧,今天终于填上了。

这,题,真,的,恶,心!写+调也就 1h30min 吧【题解】税收与补贴问题

首先,得先理解题意!!!!!


题意:

先给你一个商品的成本,以成本价为售价的销售量(这个东西在这题里没啥用)。再给你一些同样商品,不同商铺的售价,销售量。你现在想让售价为 $x$ 的商铺盈利最多,那你需要补贴/收税/不补贴也不收税使得这个商铺盈利最多,问你最少的补贴/收税。


大体思路:

  1. 先找出不收税也不补贴的最大盈利的那个商铺。
  2. 分类讨论,如果那个商铺的售价比现在想要的那个商铺高,那么就补贴。如果比想要最大盈利的那个商铺低,那么收税,如果相等,说明这个商铺就是我们要找的那个,就直接输出 0。(他不收税也不补贴都是最高的盈利那为什么还要收税/补贴,绝对值肯定大啊,那直接输出!)

一些错误点:(都是我写的时候遇到的错误)

  • 找不收税也不补贴的最大盈利,不光要向后搜还要向前搜。
  • 查找补贴多少/收税多少时,那个销售量不一定是当前销售量 - $reduce$($reduce$ 就是题目中最高单价外每升高一块钱将减少的销量),他也可能是输入的时候就有的,就是输入的那个销售量两两之间并不是差 $reduce$。
  • 还有一些 $double$/$int$ 的问题(?)

这道题最难的就是理解题意,思路什么的很好想,就是题意真的....恶心

然后代码的话 压 了 一 点 点 小 行(雾

代码:

#include<bits/stdc++.h>
using namespace std;
int wants,cnt1=-1,k=0,maxn = -1,pos;
double incosts,cnt;//成本,物品个数
int x[10000009],y[10000009];//售价,物品个数
double profit[10000009],reduce;//利润 | 每升高一块钱将减少的销量
int check[10000009],cc[10000009];
int main(){
    cin >> wants >> incosts >> cnt;
    for(int i=1; ; i++){
        cin >> x[i] >> y[i];
        k++;
        if(x[i] == y[i] && x[i] == -1){ k--; break; }
        if(x[i] == wants) cnt1 = y[i];
        profit[k] = (x[k]-incosts)*y[k];
        if(profit[k] > maxn){ maxn = profit[k]; pos = x[k]; }
        check[x[i]] = 1;
        cc[x[i]] = y[i];
    }
    cin >> reduce;
    if(cnt1 == -1) cnt1 = y[k]-(wants-x[k])*reduce;
    //找出不收税也不补贴时的最大盈利
    for(int i=1; ; i++){
        int tmpx = (x[k]+i),tmpy = (y[k]-i*reduce);
        if(tmpx < 0 || tmpy < 0)break;
        else{
            x[k+1] = tmpx;
            y[k+1] = tmpy;
            if((tmpx-incosts)*tmpy > maxn){ maxn = (tmpx-incosts)*tmpy; pos = tmpx; }
        }
    }
    for(int i=1; ; i++){//往前也要搜
        int tmpx = (x[k]-i),tmpy = (y[k]+i*reduce);
        if(tmpx < 0)break;
        else{
            x[k+1] = tmpx;
            y[k+1] = tmpy;
            if((tmpx-incosts)*tmpy >= maxn){ maxn = (tmpx-incosts)*tmpy; pos = tmpx; }
        }
    }
    if(maxn == (wants-incosts)*cnt1){ printf("0"); return 0; }//不收税也不补贴
    if(pos > wants){//需要补贴
        for(int i=1; ; i++){//补贴i元
            int q,nowpro,nexts; 
            if(check[wants-1] == 1)q = (wants-1-incosts+i)*(cc[wants-1]);
            else q = (wants-1-incosts+i)*(cnt1+reduce);
            nowpro = (wants-incosts+i)*cnt1;
            if(check[wants+1] == 1)nexts = (wants+1-incosts+i)*(cc[wants+1]);
            else nexts = (wants+1-incosts+i)*(cnt1-reduce);
            if(nowpro > nexts && nowpro > q){ cout << i; return 0; }
        }
    }
    else{//需要收税
        for(int i=1; ; i++){//收税i元
            int q,nowpro,nexts; 
            if(check[wants-1] == 1)q = (wants-1-incosts-i)*(cc[wants-1]);
            else q = (wants-1-incosts-i)*(cnt1+reduce);
            nowpro = (wants-incosts-i)*cnt1;
            if(check[wants+1] == 1)nexts = (wants+1-incosts-i)*(cc[wants+1]);
            else nexts = (wants+1-incosts-i)*(cnt1-reduce);
            if(nowpro >= nexts && nowpro >= q){ cout <<'-'<< i; return 0; }
        }
    }
    printf("NO SOLUTION");
    return 0;
}

PS: 【题解】税收与补贴问题

【题解】税收与补贴问题

上一篇:HIVE性能调优之GROUP BY# 数据倾斜


下一篇:数据倾斜