题目大意:给出一张表以及对应的权值,要求计算GPA的结果。
解题思路:可以直接暴力求解,也可以将表进行对应的Hash处理。详见code。
题目来源:http://acm.hdu.edu.cn/showproblem.php?pid=4802
暴力code:
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 3;
int n,d,cnt;
double ans;
char str[MAXN];
int main(){
//freopen("input.txt","r",stdin);
while(~scanf("%d",&n)){
cnt=0;ans=0;
for(int i=0;i<n;++i){
scanf("%d %s",&d,&str);
if(str[0]=='P' || str[0]=='N'){
ans+=0;
continue;
}
cnt+=d;
if(str[0]=='A'){
if(str[1]=='-') ans+=d*3.7;
else ans+=d*4.0;
}
if(str[0]=='B'){
if(str[1]=='-') ans+=d*2.7;
else if(str[1]=='+') ans+=d*3.3;
else ans+=d*3.0;
}
if(str[0]=='C'){
if(str[1]=='+') ans+=d*2.3;
else if(str[1]=='-') ans+=d*1.7;
else ans+=d*2.0;
}
if(str[0]=='D'){
if(str[1]=='-') ans+=d*1.0;
else ans+=d*1.3;
}
if(str[0]=='F'){
ans+=d*0;
}
}
if(cnt==0) printf("0.00\n");
else printf("%.2f\n",ans/cnt);
}
return 0;
}
Hash code:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
int n,cnt,num;
double ans;
string str;
map<string,double> m;
void init(){
m["A"]=4.0;m["A-"]=3.7;
m["B"]=3.0;m["B+"]=3.3;m["B-"]=2.7;
m["C"]=2.0;m["C+"]=2.3;m["C-"]=1.7;
m["D"]=1.3;m["D-"]=1.0;m["F"]=0;
}
int main(){
//freopen("input.txt","r",stdin);
init();
while(~scanf("%d",&n)){
cnt=0;ans=0;
for(int i=0;i<n;++i){
cin>>num>>str;
if(str=="P" || str=="N") continue;
cnt+=num;
ans+=num*m[str];
}
if(cnt==0) printf("0.00\n");
else printf("%.2f\n",ans/cnt);
}
return 0;
}