输入格式:
输入第一行包括一个整数T
输出格式:
输出一个整数S,表示小明的税前工资
样例输入整数 9255
样例输出整数 10000
评测用例 1<= T <=100000
解题思路:今晚练算法突然发现,如果一个题目反过来,原来是复杂了很多,这一题我先想着是按照传统思维每个层级叠加,然后发现不行,因为原本的薪资是未知的,而且salary_before - 3500之后,每个层级的税率是不一样的,输出是整数的话 分子*100/(100 - taxrate[i]),这里一开始没有考虑到,后来发现,你一旦原始薪资到了某个水平,之前的每个层级都是要交满的,这样就很简单了,可以想出等式
{salary_now - salaryrange[i] } * rate[i] = x - salary_now+ tax
这里的tax是之前层级交满的和,可以用一个for循环来累加,i由什么确定呢,与每个层级的薪资天花板进行比较,range[0] = 3500
//每个层次 扣除税之后的 真正拿到手的薪资水平天花板
for(int i=0;i<7;i++){
cout<<range[i]<<endl;
3500 range[0]
4955
7655
11255
30755
44755
61005 range[6]
}
后来发现 之前的i-1个层级交满 ,比如10000 ,减去基本起征点3500,就是从6500开始 1500肯定收满的(第0个层级), 4500 - 1500 的10%收满,也就是300(第1个层级) 之后6500 - 4500是第二个层级 ,但是这个层级需要自己按照等式计算了
代码如下
#include "iostream"
#include "stdio.h"
using namespace std;
int salaryrange[] = {3500,3500+1500,3500+4500,3500+9000,3500+35000,3500+55000,3500+80000};
int taxrate[]={3,10,20,25,30,35,45};
int range[7];
int main(){
int salary_now,tax,salary_before,i;
range[0]=3500;
range[0] = salaryrange[0];
//计算天花板
for(i=1;i<7;i++){
range[i] = range[i-1]+(salaryrange[i] - salaryrange[i-1]) - (salaryrange[i] - salaryrange[i-1])*taxrate[i-1]/100; //每个层次的扣完税之后的薪资
// 3% 10% 20%.....
}
cin>>salary_now;
//薪资水平
i=0;//把上面的i数值清为0
tax=0; //累计的税
for(i ; i<7; i++){
if(salary_now<=range[i]){
break;
}
}
if(i==0){
salary_before=salary_now;
}
else{
for(int m=1;m<i;m++) {
tax += (salaryrange[m] - salaryrange[m-1])*taxrate[m-1]/100 ; //之前阶级的tax的和
}
salary_before = ((salary_now + tax - salaryrange[i-1]*taxrate[i-1]/100))*100 / (100-taxrate[i-1]);
}
cout<<salary_before<<endl;
return 0;
}