27 条题解

  • 1
    @ 2021-08-29 17:03:57
    #include<bits/stdc++.h>
    using namespace std;
    
    vector<int> sales;
    vector<int> total;
    int target_price, tail_speed;
    int target_p=-1,len=0;
    int price,sale,last_price,last_sale;
    int main()
    {
        cin>>target_price;
        cin>>price>>sale;
        sales.push_back(sale);
        last_price=price;
        last_sale=sale;
        if(price==target_price)
            target_p=len;
        len++;
        while((cin>>price>>sale) && price!=-1 && sale!=-1){
            int delta_sale=(sale-last_sale)/(price-last_price);
            for(int p=last_price+1; p<price; p++){
                last_sale+=delta_sale;
                sales.push_back(last_sale);
                if(p==target_price)
                    target_p=len;
                len++;
            }
            sales.push_back(sale);
            last_price=price;
            last_sale=sale;
            if(price==target_price)
                target_p=len;
            len++;
        }
        cin>>tail_speed;
        while(last_sale>tail_speed){
            last_price++;
            last_sale-=tail_speed;
            sales.push_back(last_sale);
            if(last_price==target_price)
                target_p=len;
            len++;
        }
        for(int i=0; i<len; i++)
            total.push_back(i*sales[i]);
        int max_forward,max_backward,x=0;
        while(true){
            max_forward=*max_element(total.begin(),total.begin()+target_p);
            max_backward=*max_element(total.begin()+target_p+1,total.end());
            int t=total[target_p];
            if(max_forward<=t && max_backward<=t){
                cout<<x;
                break;
            }else if(max_forward>=t && max_backward>=t){
                cout<<"NO SOLUTION";
                break;
            }
            if(max_forward>t){
                for(int i=0; i<len; i++)
                    total[i] -= sales[i];
                x--;
            }else{
                for(int i=0; i<len; i++)
                    total[i] += sales[i];
                x++;
            }
        }
        return 0;
    }
    
  • 1
    @ 2016-09-14 12:58:17

    Var
    i,j,top,n,max,k,cb:longint;
    num,maxp:array[1..100000] of longint;
    x,y:double;
    Begin
    readln(top);
    readln(cb,j);
    num[cb]:=j;

    readln(i,j);

    while (i<>-1)and(j<>-1) do
    begin
    if i>max then max:=i;
    num[i]:=j;
    readln(i,j);
    end;

    readln(n);

    while num[max]>=0 do
    begin
    inc(max);
    num[max]:=num[max-1]-n;
    end;

    dec(max);

    for i:=cb to max-1 do
    begin
    j:=i+1;
    while num[j]=0 do inc(j);
    for k:=i+1 to j do
    num[k]:=num[k-1]+(num[j]-num[i])div(j-i);
    end;

    x:=((top+1)*num[top+1]-top*num[top]-cb*(num[top+1]-num[top]))/(num[top]-num[top+1]);
    y:=((top-1)*num[top-1]-top*num[top]-cb*(num[top-1]-num[top]))/(num[top]-num[top-1]);
    if trunc(x)<>x then x:=trunc(x)+1;
    if trunc(y)<>y then y:=trunc(y)-1;

    if x>y then
    begin
    writeln('NO SOLUTION');
    halt;
    end;

    if abs(x)>abs(y) then write(y:0:0)
    else write(x:0:0);

    End.
    //6666666666666666666666666666

  • 0
    @ 2015-05-30 15:23:18

    题目真心恶心……N次WA,无奈之下用楼下lrj的程序打了个对拍……
    有读不懂题意的到下面看看lrj的题解,里面有题意说明。如果还是看不懂,请仔细想想输入第1行给出的“政府预期价”的作用。
    看懂了题意就比较简单了,就是个枚举。不过枚举的范围要好好想想,想不出的在本页搜索xiaotao找到他的题解。
    膜拜lrj的数学解法~~

  • 0
    @ 2009-11-18 20:15:01

    刘汝佳写的:

    const m=100;

    type point=^node;

    node=record

    price:longint;

    sale:longint;

    next:point;

    end;

    var head,tail,p,q:point;

    pz,sz,pc,sc,si,pi,d,i,k:longint;

    min,max,v:real;

    b1,b2,b:longint;

    begin

    readln(pz);

    readln(pc,sc);

    new(p);head:=p;

    p^.price:=pc;p^.sale:=sc;p^.next:=nil;

    readln(pi,si);

    while pi-1 do begin

    for i:=1 to pi-p^.price do begin

    new(q);

    q^.price:=p^.price+1;

    q^.sale:=p^.sale-(p^.sale-si) div (pi-p^.price) ;

    if q^.price=pz then sz:=q^.sale;

    q^.next:=nil;

    p^.next:=q;

    p:=q;

    end;

    readln(pi,si);

    end;

    readln(d);i:=p^.price;si:=p^.sale;

    while si>d do begin

    i:=i+1;

    si:=si-d;

    new(q);

    q^.price:=i;

    q^.sale:=si;

    if q^.price=pz then sz:=q^.sale;

    q^.next:=nil;

    p^.next:=q;

    p:=q;

    end;

    p:=head;max:=-1e20;min:=1e20;

    while pnil do begin

    if sz>p^.sale then begin

    v:=((p^.price-pc)*p^.sale-(pz-pc)*sz)/(sz-p^.sale);

    if v>max then max:=v;

    end

    else if sz

  • 0
    @ 2009-09-27 10:30:16

    令人纠结的题目.....

  • 0
    @ 2009-09-25 00:42:33

    没有给出数据范围有点不爽

    模拟的基本功无疑是重要的

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

  • 0
    @ 2009-09-23 19:41:09

    第3个点怎么了.....

  • 0
    @ 2009-09-22 22:16:24

    以下是lrj写的题解,看不懂题目的快来看啊!

    第二题:

    我先来说说题目的意思。就从样例开始分析。

    输入是:

    31

    28 130

    30 120

    31 110

    -1 -1

    15

    意思就是政府预期价是31元。成本28元,按成本销售的时候可以买130件产品。

    每个卖30元的时候可以卖120个,

    每个卖31元(输入的最高价位)的时候可以卖110个,

    每个卖32元的时候可以卖:110-15=95个。

    每个卖33元的时候可以卖:110-15-15=80个。

    每个卖34元的时候可以卖:110-15-15-15=65个。

    ...

    因为“相邻价位之间的销量变化是均匀的”,因此28元卖130个,30元卖120个就可以知道

    29元卖125个(平均每元减少的销量是(130-120) div (30-28)=5)

    输出是4,我们来解释一下为什么是4。

    4代表补贴是4元,所以:

    在卖28元的时候,总利润是:(28-28+4)*130=520元,

    在卖29元的时候,总利润是:(29-28+4)*125=625元,

    在卖30元的时候,总利润是:(30-28+4)*120=720元,

    在卖31元的时候,总利润是:(31-28+4)*110=770元,

    在卖32元的时候,总利润是:(32-28+4)*95=760元,

    ...

    在卖38元的时候,总利润是:(38-28+4)*5=70元,

    显然可能的价位就是28~38了。(不能低于成本,卖39的时候销售量就是负数了)

    可以看出,现在卖31元最划算,所以人们都愿意卖31元,这样一来不就达到政府的目的了吗!!

    而当补贴是0,1,2,3的时候卖31元并不是最划算的,政府的目的达不到,你当然就没有分啦!

    题意清楚了吗?好,下面分析思路。

    穷举显然可以,但是没有什么意思,留给大家自己写。下面讲我的另外一种算法,数学味道要浓一些,

    希望大家坚持看完。

    由于需要N元钱最划算,相当于使N元钱的利润大于等于每种价格的利润。因此可以分别考虑。

    设补贴为x,则N元钱的利润是:(p为成本)

    (N-p+x)*d[N]=(N-p)*d[N]+x*d[N]

    因此N元钱比M元钱划算的时候有:

    (N-p)*d[N]+x*d[N]>=(M-p)*d[M]+x*d[M],即:

    x(d[N]-d[M])>=M*d[M]-N*d[N]-p*(d[M]-d[N])

    这样,要使N元钱比M元钱划算,x必须在区间[k1,k2] (k1,k2根据上面的式子得出)

    例如上面的例子:

    31元比28元划算时有:

    (31-28+x)*110>=(28-28+x)*130

    即:330+110x>=130x,故x=240+120x,故x=380+95x,故x>=3.33

    ...

    最后所有式子取交集,就得到了x的范围。要求绝对值最小值还不容易吗? :-P

    大家注意我在求出了k1,k2后做的最后的处理。可能有一边或两边无界的情况。

    正数和负数的处理也有区别。

    有一点需要注意:题目没有说输入价位是从小到大排序好的,虽然测试数据都是排序好的。

    我就偷个懒如何?:-P

  • 0
    @ 2009-08-28 14:44:03

    怎么用二次函数解

  • 0
    @ 2009-08-09 00:30:18

    这题真容易写乱了。

    穷举的见楼下xiaotao的退出条件!

  • 0
    @ 2009-07-27 10:46:28

    var

    max,max1,tt,j,xl,xl1,zbj,i,maxr,x,j1,j2,n:longint;

    c:array[-1..10000] of longint;

    a,b:array[1..10000] of longint;

    begin

    read(zbj);

    i:=1;

    read(a[1],b[1]);

    c[a[1]]:=b[1];

    while (a[i]-1) and (b[i]-1) do

    begin

    i:=i+1;

    readln(a[i],b[i]);

    c[a[i]]:=b[i];

    end;

    n:=i-1;

    read(xl);

    i:=1;

    while i0 do

    begin

    c[j1]:=j2;

    j1:=j1+1;

    j2:=j2-xl;

    end;

    tt:=maxlongint;

    maxr:=j1-1;

    for i:=0 to maxlongint do

    begin

    max:=0;

    for j:=a[1] to maxr do

    if (j-a[1]+i)*c[j]>max then max:=(j-a[1]+i)*c[j];

    max1:=0;

    for j:=a[1] to maxr do

    if (j-i-a[1])*c[j]>max1 then max1:=(j-i-a[1])*c[j];

    if maxtt then begin

    writeln('NO SOLUTION');

    halt;

    end;

    tt:=abs(max-(zbj-a[1]+i)*c[zbj]);

    end;

    end.

    改错

  • 0
    @ 2009-07-07 20:03:18

    题目有点绕,看懂了,模拟下就好了,边界的时候小心点

    貌似我没什么好方法,而且程序好长,咳,没戏了

  • 0
    @ 2009-06-12 10:21:37

    太恶心了,我想吐了......

  • 0
    @ 2009-02-02 20:12:15

    编译通过...

    ├ 测试数据 01:答案正确... 0ms

    ├ 测试数据 02:答案正确... 0ms

    ├ 测试数据 03:答案正确... 0ms

    ├ 测试数据 04:答案正确... 0ms

    ---|---|---|---|---|---|---|---|-

    Accepted 有效得分:100 有效耗时:0ms

    数学方法和穷举,楼下贴的刘汝佳写的题解已经说得很清楚了,在这里就不多说,我只补充一点:

    如果你是穷举,则枚举到以下这两种情况就可停了:

    if (价格-成本+补贴(即当前价格的利润)>预期价格的利润)and(当前价格的销量>预期的) then exit(补贴);{因为随着补贴的增加,两者的利润只会相差得更远}

    if (价格-成本-税收(即当前价格的利润)>预期价格的利润)and(当前价格的销量

  • 0
    @ 2008-11-08 17:32:11

    判断时要>= 不要 >

  • 0
    @ 2008-11-08 15:13:55

    以下是lrj写的题解,看不懂题目的快来看啊!

    第二题:

    我先来说说题目的意思。就从样例开始分析。

    输入是:

    31

    28 130

    30 120

    31 110

    -1 -1

    15

    意思就是政府预期价是31元。成本28元,按成本销售的时候可以买130件产品。

    每个卖30元的时候可以卖120个,

    每个卖31元(输入的最高价位)的时候可以卖110个,

    每个卖32元的时候可以卖:110-15=95个。

    每个卖33元的时候可以卖:110-15-15=80个。

    每个卖34元的时候可以卖:110-15-15-15=65个。

    ...

    因为“相邻价位之间的销量变化是均匀的”,因此28元卖130个,30元卖120个就可以知道

    29元卖125个(平均每元减少的销量是(130-120) div (30-28)=5)

    输出是4,我们来解释一下为什么是4。

    4代表补贴是4元,所以:

    在卖28元的时候,总利润是:(28-28+4)*130=520元,

    在卖29元的时候,总利润是:(29-28+4)*125=625元,

    在卖30元的时候,总利润是:(30-28+4)*120=720元,

    在卖31元的时候,总利润是:(31-28+4)*110=770元,

    在卖32元的时候,总利润是:(32-28+4)*95=760元,

    ...

    在卖38元的时候,总利润是:(38-28+4)*5=70元,

    显然可能的价位就是28~38了。(不能低于成本,卖39的时候销售量就是负数了)

    可以看出,现在卖31元最划算,所以人们都愿意卖31元,这样一来不就达到政府的目的了吗!!

    而当补贴是0,1,2,3的时候卖31元并不是最划算的,政府的目的达不到,你当然就没有分啦!

    题意清楚了吗?好,下面分析思路。

    穷举显然可以,但是没有什么意思,留给大家自己写。下面讲我的另外一种算法,数学味道要浓一些,

    希望大家坚持看完。

    由于需要N元钱最划算,相当于使N元钱的利润大于等于每种价格的利润。因此可以分别考虑。

    设补贴为x,则N元钱的利润是:(p为成本)

    (N-p+x)*d[N]=(N-p)*d[N]+x*d[N]

    因此N元钱比M元钱划算的时候有:

    (N-p)*d[N]+x*d[N]>=(M-p)*d[M]+x*d[M],即:

    x(d[N]-d[M])>=M*d[M]-N*d[N]-p*(d[M]-d[N])

    这样,要使N元钱比M元钱划算,x必须在区间[k1,k2] (k1,k2根据上面的式子得出)

    例如上面的例子:

    31元比28元划算时有:

    (31-28+x)*110>=(28-28+x)*130

    即:330+110x>=130x,故x=240+120x,故x=380+95x,故x>=3.33

    ...

    最后所有式子取交集,就得到了x的范围。要求绝对值最小值还不容易吗? :-P

    大家注意我在求出了k1,k2后做的最后的处理。可能有一边或两边无界的情况。

    正数和负数的处理也有区别。

    有一点需要注意:题目没有说输入价位是从小到大排序好的,虽然测试数据都是排序好的。

    我就偷个懒如何?:-P

  • 0
    @ 2007-11-13 09:08:22

    what is meaning???

    what does it mean??

  • 0
    @ 2007-11-08 21:37:07

    各位大牛们,请教一下,我好象样例也看不懂诶~~~~~~~~

    28 130

    30(28+2) 120(130-10)

    31(30+1) 110(120-10)

    ........

    题目说相邻价位之间销量变化是线形的,那么从第一、二行数据可以知道:(在最高价位之前)价位+1,销量-5;从第二、三行数据可知:(在最高价位之前)价位+1,销量-10.这样岂不是矛盾了???????

  • 0
    @ 2007-11-06 23:16:44

    1.谢谢梦ぁ逍遥

    2.同鄙视zly

    3.我从天王星来(冥王星太远了的说)……

    4.想到一句经典的话:操你妈,太牛逼了!(不要锁我号~,如果不爽的话可以短消息,我会立马改掉的)

  • 0
    @ 2007-10-28 20:19:44

    到底讲虾米吗??

信息

ID
1346
难度
6
分类
其他 | 数学 点击显示
标签
递交数
1036
已通过
277
通过率
27%
被复制
18
上传者