问题描述
试题编号: | 201612-2 |
试题名称: | 工资计算 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: | 问题描述 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资。假设他一个月的税前工资(扣除五险一金后、未扣税前的工资)为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
}