CCF-CSP 201612-2 工资计算

 

问题描述

试题编号:201612-2
试题名称:工资计算
时间限制:1.0s
内存限制:256.0MB
问题描述:

问题描述

  小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为S元,则他应交的个人所得税按如下公式计算:
  1) 个人所得税起征点为3500元,若S不超过3500,则不交税,3500元以上的部分才计算个人所得税,令A=S-3500元;
  2) A中不超过1500元的部分,税率3%;
  3) A中超过1500元未超过4500元的部分,税率10%;
  4) A中超过4500元未超过9000元的部分,税率20%;
  5) A中超过9000元未超过35000元的部分,税率25%;
  6) A中超过35000元未超过55000元的部分,税率30%;
  7) A中超过55000元未超过80000元的部分,税率35%;
  8) A中超过80000元的部分,税率45%;
  例如,如果小明的税前工资为10000元,则A=10000-3500=6500元,其中不超过1500元部分应缴税1500×3%=45元,超过1500元不超过4500元部分应缴税(4500-1500)×10%=300元,超过4500元部分应缴税(6500-4500)×20%=400元。总共缴税745元,税后所得为9255元。
  已知小明这个月税后所得为T元,请问他的税前工资S是多少元。

输入格式

  输入的第一行包含一个整数T,表示小明的税后所得。所有评测数据保证小明的税前工资为一个整百的数。

输出格式

  输出一个整数S,表示小明的税前工资。

样例输入

9255

样例输出

10000

评测用例规模与约定

  对于所有评测用例,1 ≤ T ≤ 100000。

 

这个问题博主最开始的思路是逆向,暴力if分支来做,最后在vscode上可以运行,但提交超时了,然后我又考虑了正向,直接把tax函数写出来,然后由于所有评测数据保证小明的税前工资为一个整百的数 利用这一点暴力循环枚举,结果又超时了;然后博主又找到二分查早这种方法优化,结果还是超时(哭

如下

/*
#include<iostream>
using namespace std;
int tax(int S){
int A=S-3500;
int tax=0;
if(A<=0){
tax=0;
}
else if(A<=1500){
tax=A*0.03;
}
else if(A<=4500){
tax=45+(A-1500)*0.1;
}
else if(A<=9000){
tax=45+300+(A-4500)*0.2;
}
else if(A<=35000){
tax=45+300+900+(A-9000)*0.25;
}
else if(A<=55000){
tax=45+300+900+6500+(A-35000)*0.3;
}
else if(A<80000){
tax=45+300+900+6500+6000+(A-55000)*0.35;
}
else{
tax=45+300+900+6500+6000+12250+(A-80000)*0.45;
}
return S-tax;

}
int main(){
int S,T;

cin>>T;
S=T/100*100;
if(T<=3500){
cout<<T<<endl;
return 0;
}

int low=S,high=2*S;
int mid;
while(low<=high){
    mid=((low+high)/2)/100*100;
    if(tax(mid)==T){
        cout<<mid<<endl;
        return 0;
    }
    else if(tax(mid)<T)
    {
        low = mid + 100; 
    }
    else{
        high=mid-100;
    }
}
}*/
//运行超时

最后还是向gpt取经(直接提交还是失败),并且经过我的修改

:((low + high) / 2)/100*100这句话我/100*100来保证枚举量是一个100的倍数

代码如下 :

#include<iostream>
using namespace std;

int calculateTax(int income) {
    static const int threshold = 3500;
    static const int levels[] = { 1500, 4500, 9000, 35000, 55000, 80000 };
    static const float rates[] = { 0.03, 0.1, 0.2, 0.25, 0.3, 0.35, 0.45 };
    static const int quickDeduction[] = { 0, 45, 345, 1245, 7745, 13745, 22495 };

    int taxable = income - threshold;
    if (taxable <= 0) return 0;

    int tax = 0;
    for (int i = 0; i < 7; ++i) {
        if (i == 6 || taxable > levels[i]) {
            int maxAmount = i == 6 ? taxable : levels[i];
            tax += (maxAmount - (i == 0 ? 0 : levels[i-1])) * rates[i];
        } else {
            tax += (taxable - (i == 0 ? 0 : levels[i-1])) * rates[i];
            break;
        }
    }
    return tax;
}

int reverseTax(int netIncome) {
    if (netIncome <= 3500) return netIncome;

    int low = 3500, high = 1000000;  // 设定一个合理的高值范围
    while (low <= high) {
        int mid = ((low + high) / 2)/100*100;
        int calcNetIncome = mid - calculateTax(mid);
        if (calcNetIncome == netIncome) {
            return mid;
        } else if (calcNetIncome < netIncome) {
            low = mid + 100;
        } else {
            high = mid - 100;
        }
    }
    return -1;  // 如果没有找到精确的匹配,返回-1
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值