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; }
相关文章推荐
- CODE[VS] 1016 税收与补贴问题
- CODE[VS] 1016 税收与补贴问题
- 【题解】 状态压缩 CSYZOJ 1040 || codevs 1295 || hdu 2553 N皇后问题
- Codevs 1983 等式问题
- [Codevs] 1282 约瑟夫问题
- 【BFS】CODE[VS] 1226 倒水问题 (BFS+模拟)
- code vs 2602 最短路径问题
- vscode 保存时自动格式化出问题 解决的三种办法
- Codevs_P3299 有序数组合并求第K大问题(Treap)
- 解决忽略vscode中pylint报错的问题
- vs2013版本中 App_Code文件夹下类的调用问题
- Codevs4880 位数问题 数位dp?
- 【日常学习】【数学】codevs3625 士兵站队问题题解
- codevs1014 装箱问题(DP)
- vscode 解决import github包的问题
- VS Code1.4 搭建Golang的开发调试环境(遇到很多问题)
- 【codevs1904】[网络流24题]最小路径覆盖问题
- CODE【VS】2623 小车问题(数学)
- codevs 核电站问题 2618
- 约数和问题 (codevs2606 && 洛谷2424)