zoukankan      html  css  js  c++  java
  • CCF NOI1021 发放奖金

    问题链接CCF NOI1021 发放奖金




    时间限制: 1000 ms  空间限制: 262144 KB

    题目描述

      企业发放的奖金根据利润分段计算提成。当利润I低于或等于10万元的,奖金可提10%;利润高于10万元,低于20万元,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万的,低于20万的部分仍按上述办法提成(下同)。高于20万元的部分按5%提成;40万到60万时,高于40万的部分按3%提成;60万到100万时,高于60万的部分按1.5%提成;I>=100万元时,超过100万元的部分按1%提成。输入当月利润I,求应发奖金总数(单位为元)?(输出保留小数点后三位)

    输入

      输入实数I,表示利润。

    输出

      输出奖金数,答案保留三位小数。

    样例输入

    100000

    样例输出

    10000.00

    数据范围限制

      0<I<=1,000,000



    问题分析

      这个问题是一个分段计算的问题。

      写程序时,有一种做法是将问题中给出的参数写入程序代码中。这种做法使得程序的可修改性变差。虽然程序可以正确,但是给差评。

    程序说明

      程序中,使用两个数组来存储问题中给定的参数。这样使得程序的可修改性得到提高,那些参数改变时不需要修改程序代码,只需要修改数组数据。

      需要注意的是,由于数据值比较大,需要使用double类型,保证程序算出正确结果。

      程序中,宏定义符号变量N,也是增加程序通用性的有效做法。

    要点详解
    • 使用数组存储原始参数是一种好的做法,可以增加程序的可修改性。参数值改变时,不需要修改程序代码,只需要修改数组数据。
    • 数据值比较大时,要使用double类型,否则结果会出错。



    100分通过的C语言程序:

    #include <stdio.h>
    
    int profit[] = {0, 100000, 200000, 400000, 600000, 1000000};
    double ratio[] = {0, 0.1, 0.075, 0.05, 0.03, 0.015, 0.01};
    
    #define N (int)(sizeof(profit) / sizeof(int))
    
    int main(void)
    {
        double p, ans;
        int i;
    
        scanf("%lf", &p);
    
        ans = 0;
        for(i=1; i<N; i++) {
            if(p <= profit[i]) {
                ans += (p - profit[i - 1]) * ratio[i];
                break;
            } else
                ans += (profit[i] - profit[i - 1]) * ratio[i];
        }
        if(i == N && p > profit[N - 1])
            ans += (p - profit[N - 1]) * ratio[N];
    
        printf("%.3lf
    ", ans);
    
        return 0;
    }




  • 相关阅读:
    Riverside Curio
    bzoj1010 [HNOI2008]玩具装箱toy
    bzoj1898 [Zjoi2005]Swamp 沼泽鳄鱼
    hdu 5435 A serious math problem
    poj2411 Mondriaan's Dream
    bzoj3450 Tyvj1952 Easy
    关于欧拉函数与莫比乌斯函数等一系列积性函数的线性筛
    NOIP后一波总结
    回忆一下电子科技大学春令营
    【算法】背包九讲
  • 原文地址:https://www.cnblogs.com/tigerisland/p/7563923.html
Copyright © 2011-2022 走看看