[2000年NOIP普及组] 税收与补贴问题
试题分析:
销量与售价的关系为:前一个较大的销量减去差值
已列出范围内(按进价出售的销量与最后列出的销量)的每两个之间的差值:(前一个列出的较大的销量与后一个列出的较小的销量的差值)除以(后一个列出的较大的售价与前一个列出的较小的售价的差值)
利润:若原有的最大利润的售价偏大,则需要补贴(因为售价越高,销量越小,影响也越小,拿到的补贴也小)
若原有的最大利润的售价偏小,则需要收税(因为售价越低,销量越大,影响也越大,交的税也就少)
所以当最大利润的售价比政府希望的售价偏小时,就要收税,相反则补贴
#include<bits/stdc++.h>
using namespace std;
int gz,maxx,fs;
int da,bjj,n,i,j,a[100000],b[100000],c[100000],cb,xl,bj,zj,s,ss;
int main(){
cin>>n;
cin>>cb>>xl;
a[0]=xl;
b[0]=0;
n=n-cb;
c[0]=xl;
while(1){
cin>>i>>j;
if(i==-1&&j==-1){
break;
}
a[i-cb]=j;
bj++;
b[bj]=i-cb;//a的序号
c[bj]=j;
}
cin>>zj;
for(i=0;i<bj;i++){
s=(c[i]-c[i+1])/(b[i+1]-b[i]);
ss=c[i];
for(j=b[i]+1;j<b[i+1];j++){
ss=ss-s;
a[j]=ss;
}//给已列出范围的其他售价的销量赋值
}
a[b[bj]+1]=a[b[bj]]-zj;
bjj=b[bj]+1;
for(i=b[bj]+2;i<=n+1;i++){
a[i]=a[i-1]-zj;
bjj++;
}//若政府希望的定价再已知的外面
gz=-1;
while(1){
gz++;
maxx=0;
for(i=1;i<=bjj;i++){
if(a[i]*(i+gz)>a[maxx]*(maxx+gz)){
maxx=i;
}
else if(a[i]*(i+gz)==a[maxx]*(maxx+gz)){//当最大利润相同时优先以政府希望的售价为先,其余以较大的售价为主
if(i==n){
maxx=n;
}
else if(maxx==n){
maxx=n;
}
else{
maxx=i;
}
}
if(i>=n&&maxx!=n){
break;
}
}
if(maxx==n){
break;
}
if(maxx<n){
gz=-1;
break;
}//补贴无法得到想要的售价
}
fs=-1;
while(1){
fs++;
maxx=0;
for(i=1;i<=bjj;i++){
if(a[i]*(i-fs)>a[maxx]*(maxx-fs)){
maxx=i;
}
else if(a[i]*(i-fs)==a[maxx]*(maxx-fs)){
if(i==n){
maxx=n;
}
else if(maxx==n){
maxx=n;
}
else{
maxx=i;
}
}
if(i>=n&&maxx!=n){
break;
}
}
if(maxx==n){
break;
}
if(maxx>n){
fs=-1;
break;
}
}
if(fs==-1&&gz==-1){
cout<<"NO SOLUTION";
return 0;
}
else if((gz==-1&&fs!=-1)||(fs!=-1&&gz!=-1&&fs<gz)){
cout<<-fs;
}
else {
cout<<gz;
}
}
浙公网安备 33010602011771号