您的位置:首页 > 其它

CODE[VS]1016 税收与补贴问题

2017-09-06 14:15 288 查看
题目:http://codevs.cn/problem/1016/

思路:问题可解释为,政府通过税收或补贴方式,来使预期价格下,商家获取的利润最大。第一根据线性变化,补齐已知的价格-销量表,根据销量减少值,获取最大的可能价格。根据成本价到最大价的销量表,计算每个价格的总利润。然后通过税收或补贴来更新利润,使预期价格时的利润最大。税收或补贴后的利润 = 原利润 (+ 补贴 * 销量) 或 (- 税收 * 销量)。税收或补贴的范围为成本 值 最大价格

题解:

/* 1016 税收与补贴问题 */
#include <stdio.h>

#define DEBUG
#define MAXT 10000  /* 最大价格值 */

/* 价格 - 销量表 */
struct _sales_table{
int sales;      /* 当前价格销量 */
int dec;        /* 当前价格下降率 */
int gain;       /* 当前价格利润 */
}table[MAXT];

int expect, max_gain, ei;       /* 预期价格 */
int rate;                       /* 销量减少速率 */
int tax;                        /* 税收或补贴 */

/* 主函数入口 */
int main(int argc, char *argv[]) {
int p, s, pp, ps;       /* 价格,销量, 上一次输入价格,销量 */
int i;                  /* 索引值 */
int cost, max_price;    /* 成本,最大可能价格 */
#ifdef DEBUG
FILE *fp;
if(NULL == (fp = fopen("data.txt", "r"))){
return 1;
}
#endif
/* 初始化价格-销量表 */
for(i = 0; i < MAXT; i++){
table[i].sales = -1;
}
/* 获取预期价格 */
#ifdef DEBUG
fscanf(fp, "%d", &expect);
#else
scanf("%d", &expect);
#endif
/* 获取成本价-销量值 */
#ifdef DEBUG
fscanf(fp, "%d %d", &p, &s);
#else
scanf("%d %d", &p, &s);
#endif
table[p].sales = s;
table[p].gain = 0;
cost = p;
pp = p;
ps = s;
/* 获取已知价格-销量表 */
do{
#ifdef DEBUG
fscanf(fp, "%d %d", &p, &s);
#else
scanf("%d %d", &p, &s);
#endif
if(p <= 0 || s <= 0){
break;
}
table[p].sales = s;
table[p].gain = (p - cost) * s;
/* 根据两次输入获取上一价格销量减少率 */
table[pp].dec = (ps - s) / (p - pp);
pp = p;
ps = s;
}while(p > 0 && s > 0);

/* 获取销量递减值 */
#ifdef DEBUG
fscanf(fp, "%d", &rate);
#else
scanf("%d", &rate);
#endif

table[pp].dec = rate;
/* 计算完整价格-销量表 */
i = cost;
do{
s = table[i].sales - table[i].dec;
/* 如果下一个价格未指定则由上一价格及其减少率来确定 */
if(s > 0 && (-1 == table[i + 1].sales)){
table[i + 1].sales = s;
table[i + 1].dec = table[i].dec;
table[i + 1].gain = (i - cost + 1) * s;
}
i++;
}while(s > 0);
/* 获取最大的可能价格 */
max_price = i;

/* 测试用 - 打印完整价格-销售 */
/*
for(i = cost ; i < max_price; i++){
printf("%d - %d - %d\n", i, table[i].sales, table[i].gain);
}
*/
/* 计算补贴或税收 */
for(tax = 0; tax < max_price; tax++){
/* 补贴 */
max_gain = table[expect].gain + table[expect].sales * tax;
for(i = cost; i < max_price; i++){
if((table[i].gain + table[i].sales * tax) > max_gain){
break;
}
}
/* 如果当前补贴下利润最大,则退出计算,并输出结果 */
if(i == max_price){
printf("%d", tax);
break;
}
/* 收税 */
max_gain = table[expect].gain - table[expect].sales * tax;
for(i = cost; i < max_price; i++){
if((table[i].gain - table[i].sales * tax) > max_gain){
break;
}
}
/* 如果当前税收下利润最大,则退出计算,并输出结果 */
if(i == max_price){
printf("%d", -1 * tax);
break;
}
}
/* 未找到合适税收或补贴 */
if(tax == max_price){
printf("NO SOLUTION");
}
#ifdef DEBUG
fclose(fp);
#endif
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: