NC16849. [NOI1998]个人所得税
描述
某国个人所得税法规定,普通公民的主要应纳税收入项目及纳税金额如下:
工资、薪金所得。按月计算征税,以每月收入额减除费用800元后的余额作为该月应纳税所得额,税率如下表所示:
级数 | 月应纳税所得额 | 税率(%) |
1 | 不超过500元的 | 5 |
2 | 超过500元~2000元的部分 | 10 |
3 | 超过2000元~5000元的部分 | 15 |
4 | 超过5000元~20000元的部分 | 20 |
5 | 超过20000元~40000元的部分 | 25 |
6 | 超过40000元~60000元的部分 | 30 |
7 | 超过60000元~80000元的部分 | 35 |
8 | 超过80000元~100000元的部分 | 40 |
9 | 超过100000元的部分 | 45 |
一次性劳动报酬所得。按次计算征税,每次不超过4000元的,减除费用800元;4000元以上的,减除20%的费用,余额为应纳税所得额。征税税率如下表所示:
级数 | 每次应纳税所得额 | 税率(%) |
1 | 不超过20000元的部分 | 20 |
2 | 超过20000元~50000元的部分 | 30 |
3 | 超过50000元的部分 | 40 |
由上面可以看出,个人工资、薪金及一次性劳动报酬所得都是按照超额累进税率来征税的。超额累进税率将应纳税所得额按数额大小分成若干等级,每一等级规定一个税率,税率依次提高,但每一纳税人的的应纳税所得额依照所属等级同时适用几个税率分别计算,将计算结果相加后的总额作为应纳税款。
例如,某人某月工资总额为3800元,减去800元后,应纳税所得额为3000元。其中1级500元,2级1500元,3级1000元,税率分别为5%、10%、15%,应纳税总额为500*5%+1500*10%+1000*15%=325(元)。计算过程如图一所示。
现在需要你编一程序,根据该国某公司的所有职员一年内的各项收入信息(收入项目、收入时间、收入金额)计算该公司所有职员这一年应交纳的个人所得税总额。
输入描述
第一行为一个正整数M(M ≤ 50000),表示该公司的职员总数(职员编号依次为1,2,…,M)。接下来的各行每行表示一年内某一个职员的一项收入信息。具体格式如下:
工资、薪金收入信息:PAY 职员编号 收入时间 收入金额
一次性劳务报酬收入信息:INCOME 职员编号 收入时间 收入金额
其中,收入时间格式为:MM/DD,MM表示月份(1 ≤ MM ≤ 12),DD表示日期(1 ≤ DD ≤ 31);收入金额是一个正整数(单位:元),并假设每人每项收入金额小于100万元。
输入文件以字符“#”表示结束。输入文件中同一行相邻两项之间用一个或多个空格隔开。
输出描述
只有一个正数P,P表示该公司所有职员一年内应交纳的个人所得税总额(单位:元)。保留两位小数。
示例1
输入:
2 PAY 1 2/23 3800 INCOME 2 4/8 4010 INCOME 2 4/18 800 PAY 1 8/14 6700 PAY 1 8/10 1200 PAY 2 12/10 20000 #
输出:
5476.60
C++11(clang++ 3.9) 解法, 执行用时: 8ms, 内存消耗: 380K, 提交时间: 2019-11-05 17:30:03
#include<bits/stdc++.h> #define int long long using namespace std; const int N=5e4+50; int n,id,a[N][20];char s[10];double ans; signed main(){ scanf("%d",&n); while(1){ scanf("%s",s); if(s[0]=='#')break; int id,x,y;double val; scanf("%d%d/%d%lf",&id,&x,&y,&val); if(s[0]=='I'){ if(val<=4000)val-=800; else val*=0.8; if(val<0)continue; double dat=min(val,20000.0); ans+=dat*0.2,val-=dat; dat=min(val,30000.0); ans+=dat*0.3,val-=dat; ans+=val*0.4; } else a[id][x]+=val; } for(int i=1;i<=n;i++){ for(int j=1,val,dat;j<=12;j++){ val=a[i][j]-800; if(val<=0)continue; dat=min(val,500ll); ans+=dat*0.05;val-=dat; dat=min(val,1500ll); ans+=dat*0.1;val-=dat; dat=min(val,3000ll); ans+=dat*0.15;val-=dat; dat=min(val,15000ll); ans+=dat*0.2;val-=dat; dat=min(val,20000ll); ans+=dat*0.25;val-=dat; dat=min(val,20000ll); ans+=dat*0.3;val-=dat; dat=min(val,20000ll); ans+=dat*0.35;val-=dat; dat=min(val,20000ll); ans+=dat*0.4;val-=dat; ans+=val*0.45; } } printf("%.2f",ans); return 0; }