1. 程式人生 > >洛谷 P1023 稅收與補貼問題

洛谷 P1023 稅收與補貼問題

lan 說明 std 輸入 獲取 情況 現在 不能 單位

P1023 稅收與補貼問題

題目背景

每樣商品的價格越低,其銷量就會相應增大。現已知某種商品的成本及其在若幹價位上的銷量(產品不會低於成本銷售),並假設相鄰價位間銷量的變化是線性的且在價格高於給定的最高價位後,銷量以某固定數值遞減。(我們假設價格及銷售量都是整數)

對於某些特殊商品,不可能完全由市場去調節其價格。這時候就需要政府以稅收或補貼的方式來控制。(所謂稅收或補貼就是對於每個產品收取或給予生產廠家固定金額的貨幣)

題目描述

你是某家咨詢公司的項目經理,現在你已經知道政府對某種商品的預期價格,以及在各種價位上的銷售情況。要求你確定政府對此商品是應收稅還是補貼的最少金額(也為整數),才能使商家在這樣一種政府預期的價格上,獲取相對其他價位上的最大總利潤。

總利潤=單位商品利潤 \times× 銷量

單位商品利潤=單位商品價格 - 單位商品成本 (- 稅金 or + 補貼)

輸入輸出格式

輸入格式:

輸入的第一行為政府對某種商品的預期價,第二行有兩個整數,第一個整數為商品成本,第二個整數為以成本價銷售時的銷售量,以下若幹行每行都有兩個整數,第一個為某價位時的單價,第二個為此時的銷量,以一行 -11 , -11 表示所有已知價位及對應的銷量輸入完畢,輸入的最後一行為一個單獨的整數表示在已知的最高單價外每升高一塊錢將減少的銷量。

輸出格式:

輸出有兩種情況:若在政府預期價上能得到最大總利潤,則輸出一個單獨的整數,數的正負表示是補貼還是收稅,數的大小表示補貼或收稅的金額最小值。若有多解,取絕對值最小的輸出。

如在政府預期價上不能得到最大總利潤,則輸出“NO SOLUTION”。

輸入輸出樣例

輸入樣例#1: 復制
31
28 130
30 120
31 110
-1  -1
15
輸出樣例#1: 復制
4

說明

所有數字均小於100000

思路:模擬。

註意有相等的情況,maxn重新賦值。

#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define
MAXN 100010 using namespace std; int n,b,tot=1,most; int vis[MAXN],vv[MAXN]; int cost,savol,lost; struct nond{ int c,s; }v[MAXN]; int cmp(nond a,nond b){ return a.c<b.c; } void init(){ scanf("%d",&n); scanf("%d%d",&cost,&savol); while(scanf("%d%d",&v[tot].c,&v[tot].s)){ if(v[tot].c==-1&&v[tot].s==-1) break; tot++; vv[v[tot].c]=v[tot].s; } scanf("%d",&lost); } void pre(){ sort(v+1,v+1+tot,cmp); most=v[tot].c+v[tot].s/lost; v[1].c=cost;v[1].s=savol; for(int i=2;i<=tot;i++) for(int j=v[i-1].c;j<=v[i].c;j++) vv[j]=v[i-1].s+((v[i].s-v[i-1].s)/(v[i].c-v[i-1].c))*(j-v[i-1].c); for(int i=v[tot].c;i<=most;i++) vv[i]=v[tot].s-lost*(i-v[tot].c); } void work(){ for(int i=0;i<=100000;i++){ int maxn=-0x7f7f7f7f,val; long long w; for(int j=cost;j<=most;j++){ if(j<=v[tot].c) w=(j-cost+i)*vv[j]; else w=(j-cost+i)*vv[j]; if(w>=maxn){ maxn=w;val=j; } } if(val==n){ cout<<i;exit(0); } maxn=-0x7f7f7f7f; for(int j=cost;j<=most;j++){ if(j<=v[tot].c) w=(j-cost-i)*vv[j]; else w=(j-cost-i)*vv[j]; if(w>=maxn){ maxn=w;val=j; } } if(val==n){ cout<<"-"<<i;exit(0); } } } int main(){ init(); pre(); work(); cout<<"NO SOLUTION"; } /* 4011 1 79990 7999 10 -1 -1 10 */

洛谷 P1023 稅收與補貼問題