首页 > 其他分享 >CSP历年复赛题-P1023 [NOIP2000 普及组] 税收与补贴问题

CSP历年复赛题-P1023 [NOIP2000 普及组] 税收与补贴问题

时间:2024-05-21 18:12:01浏览次数:21  
标签:NOIP2000 int maxs 单价 销量 补贴 P1023 31 CSP

原题链接:https://www.luogu.com.cn/problem/P1023

题意解读:给定商品单价和对应销量表,计算使得采用预期价格销售得到最大利润时的最小补贴或者税收。

解题思路:

1、样例模拟

31
28 130
30 120
31 110
-1  -1
15

政府预期价格:31

商品成本:28,按成本价售卖销量:130

商品单价:30,对应销量:120

商品单价:31:对应销量:110

超出商品最高单价31后,每增加一元,销量降低15

要计算预期价带来的总利润是否最大,就要和所有价格带来的总利润进行比较,因此需要将商品单价从28以上销量不为0的数据都补充完整

比如:28和30元之间有29元,根据销量是线性的得知29元的销量是130 - (130 - 120) / 2 = 125

然后针对31元以上的销量每增加一元减少15进行补充,最终得到单价-销量表:

28 130
29 125
30 120
31 110
32 95
33 80
34 65
35 50
36 35
37 20
38 5

 再分别枚举补贴和税收,补贴从1~100000,税收从-1到-100000

如果找到一个补贴,使得按照预期价格销售的总利润最大,则记录补贴值

如果找到一个税收,使得按照预期价格销售的总利润最大,则记录税收值

最后根据补贴和税收的值,输出绝对值较小的

2、算法总结

第一步:构建一个价格-销量表,价格从成本价以上,每增加1都有对应的销量,销量大于0

第二步:枚举补贴,计算使得按照预期价格销售的总利润最大的第一个补贴值

第三步:枚举税收,计算使得按照预期价格销售的总利润最大的第一个税收值

第四步:输出结果

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 100005;

int t; //政府预期价
int s, ss; //成本价,成本价的销量
int p[N]; //价格-销量表,单价对应的销量
int d; //最高单价外每升高一块钱将减少的销量

int main()
{
    cin >> t >> s >> ss;
    int x, y; 
    int lastx = s, lasty = ss; //上一个单价、销量
    int maxp; //最大单价

    p[s] = ss;
    while(cin >> x >> y)
    {
        if(x == -1 && y == -1) break;
        maxp = max(maxp, x); //记录最大单价
        p[x] = y;
        int change = (lasty - y) / (x - lastx); //计算单价lastx到x之间单价每增加1,销量变化值
        for(int i = lastx + 1, j = 1; i < x; i++, j++)
        {
            p[i] = lasty - change * j;
        }
        lastx = x, lasty = y;
    }
    cin >> d;
    
    //补齐超出最大单价的销量
    for(int i = 1; p[maxp] - d * i > 0; i++)
    {
        p[maxp + i] = p[maxp] - d * i;
    }

    //枚举补贴,1~100000
    int a = INT_MAX;
    for(int bt = 1; bt <= 100000; bt++)
    {   
        int yuqi = (t - s + bt) * p[t]; //政府预期价格的利润
        int maxs = 0; //最大利润
        for(int i = s; p[i] > 0; i++)
        {
            maxs = max(maxs, (i - s + bt) * p[i]);
        }
        if(yuqi == maxs)
        {
            a = bt;
            break;
        }
    }

    //枚举税收,-1~-100000
    int b = INT_MAX;
    for(int tax = -1; tax >= -100000; tax--)
    {   
        int yuqi = (t - s + tax) * p[t]; //政府预期价格的利润
        int maxs = 0; //最大利润
        for(int i = s; p[i] > 0; i++)
        {
            maxs = max(maxs, (i - s + tax) * p[i]);
        }
        if(yuqi == maxs)
        {
            b = tax;
            break;
        }
    }
    
    if(a == INT_MAX & b == INT_MAX) cout << "NO SOLUTION";
    else
    {
        if(abs(a) < abs(b)) cout << a;
        else cout << b;
    }
    return 0;
}

 

标签:NOIP2000,int,maxs,单价,销量,补贴,P1023,31,CSP
From: https://www.cnblogs.com/jcwy/p/18204681

相关文章

  • CSP历年复赛题-P1028 [NOIP2001 普及组] 数的计算
    原题链接:https://www.luogu.com.cn/problem/P1028题意解读:给定n,构造数列,可以用递归或者递推。解题思路:1、递归定义count(n)返回数列的个数  n==1时,count(n)=1  n!=1时,count(n)=1+count(1)+count(2)+...+count(n/2)注意,递归会导致大量重复计算,需要用一个hash......
  • CSP历年复赛题-P1029 [NOIP2001 普及组] 最大公约数和最小公倍数问题
    原题链接:https://www.luogu.com.cn/problem/P1029题意解读:已知x,y,求有多少对p、q,使得p、q的最大公约数为x,最小公倍数为y。解题思路:枚举法即可。枚举的对象:枚举p,且p必须是x的倍数,还有p<=yq的计算:q=x*y/p,q要存在,必须x*y%p==0,且gcd(p,q)==x100分代码:#include......
  • CSP历年复赛题-P1022 [NOIP2000 普及组] 计算器的改良
    原题链接:https://www.luogu.com.cn/problem/P1022题意解读:求解一元一次方程。解题思路:直接采用模拟法,对字符串进行解析设x保存未知数字母设lx保存"="左边的未知数系数,多个系数要累加设l保存"="左边的整数,多个整数要累加设rx保存"="右边的未知数系数,多个系数要累加设r保存"......
  • CSP历年复赛题-P1016 [NOIP1999 提高组] 旅行家的预算
    原题链接:https://www.luogu.com.cn/problem/P1016题意解读:用最少的加油费用到达另一个城市,中间有若干加油点,起点也可加油。解题思路:本题是一个贪心策略题:枚举每一个加油点i:1、初始加油点是起点2、汽车能跑的最大距离范围内,找到下一个更便宜的加油点的位置3、如果能找到更便......
  • CSP历年复赛题-P1015 [NOIP1999 普及组] 回文数
    原题链接:https://www.luogu.com.cn/problem/P1015题意解读:一个N进制数M,把M正序和M逆序相加,几次之后得到是数是回文数,如果超过30次还无法得到回文数,输出Impossible!。解题思路:M最长100位,因此需要高精度,定义数组vector<int>m来存储整数M注意:16进制中可能存在'a~f''A~F'等字母,需......
  • CSP历年复赛题-P1014 [NOIP1999 普及组] Cantor 表
    原题链接:https://www.luogu.com.cn/problem/P1014题意解读:根据z字形遍历,求第n个数。解题思路:根据题意,遍历顺序如下图所示观察得知,第i层的x/y的x+y=i+1,并且如果i是偶数,x从1开始枚举;如果i是奇数,x从i开始枚举100分代码:#include<bits/stdc++.h>usingnamespacestd;in......
  • CSP历年复赛题-P1008 [NOIP1998 普及组] 三连击
    原题链接:https://www.luogu.com.cn/problem/P1008题意解读:将 1,2,…,9共 9个数分成3组,分别组成3个三位数,且使这 3 个三位数构成 1:2:3的比例,枚举所有的组合即可。解题思路:设定三个数a、b、c枚举a,最小123,最大987b=a*2,c=a*3判断b、c是否是三位数,且a、b、c中所......
  • CSP历年复赛题-P1009 [NOIP1998 普及组] 阶乘之和
    原题链接:https://www.luogu.com.cn/problem/P1009题意解读:  利用高精度计算阶乘之和,需要用到高精度乘法(高精度乘低精度)、高精度加法。  首先,思考不利用高精度如何解题,直观方法就是遍历i从1到n,每次乘i得到i的阶乘,然后累加到结果,代码如下:#include<bits/stdc++.h>usingnam......
  • CSP历年复赛题-P1010 [NOIP1998 普及组] 幂次方
    原题链接:https://www.luogu.com.cn/problem/P1010题意解读:输出一个正整数的2的幂次方表示,需要用到二进制数学知识,将整数拆解成2的次幂之和,幂次方也要进行拆解,因此容易想到通过递归处理。解题思路:先看样例,给定整数137,要拆解成2的幂次方之和,先考虑i使得刚好137>=2^i时,i取7,因此2......
  • CSP历年复赛题-P1548 [NOIP1997 普及组] 棋盘问题
    原题链接:https://www.luogu.com.cn/problem/P2241题意解读:要在整个n*m区域计算正方形和长方形的个数,枚举法即可。解题思路:此题枚举的对象是矩形的高i和宽j,高的范围[1,n],宽的范围[1,m],然后计算在n*m区域内有多少个i*j,i==j即属于正方形,i!=j属于长方形。那么,问题就集中在了......