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

题目: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;
}

猜你喜欢

转载自blog.csdn.net/QQ604666459/article/details/77865751