P1051题解
这是本蒟蒻第一次写题解,如有错误,请在评论区积极指出,我不怕被骂
大体思路:
首先,我们来观察一下题目,挺长。
众所周知,题目越长题越简单。
题意:
首先,定义一个结构体数组。
然后根据奖学金的具体情况来编写 if 语句。
再把结构体数组 sort 排序。
最后输出,大功告成。
(这道题这么水,应该都能做出来吧)
先贴个 sort 语句的 cmp 函数(别忘加头文件 algorithm ):
1 bool cmp(mon a,mon b){ 2 if(a.t!=b.t) return a.t>b.t;//总奖学金高的在前 3 return a.num<b.num;//序号小的在前 4 }
再直接上代码:
1 #include<iostream> 2 #include<string> 3 #include<algorithm> 4 using namespace std; 5 struct mon{ 6 string n;//n是名字 7 int t,num;//t是总奖学金数,num是序号 8 }stu[105]; 9 bool cmp(mon a,mon b){ 10 if(a.t!=b.t) return a.t>b.t; 11 return a.num<b.num; 12 }//sort的cmp函数 13 int main(){ 14 int n,sum=0; 15 cin>>n; 16 for(int i=1;i<=n;i++){ 17 int q,b,l; 18 char x,w;//就是挨个定义,这两行也可以加到结构体里去 19 cin>>stu[i].n>>q>>b>>x>>w>>l; 20 stu[i].num=i;//序号就是i 21 if(q>80&&l>=1) stu[i].t+=8000;//院士奖学金 22 if(q>85&&b>80) stu[i].t+=4000;//五四奖学金 23 if(q>90) stu[i].t+=2000;//成绩优秀奖 24 if(q>85&&w=='Y') stu[i].t+=1000;//西部奖学金 25 if(b>80&&x=='Y') stu[i].t+=850;//班级贡献奖 26 sum+=stu[i].t;//总数 27 } 28 sort(stu+1,stu+n+1,cmp);//大小排序 29 cout<<stu[1].n<<endl<<stu[1].t<<endl<<sum; 30 return 0;//好习惯 31 }
但是,这种题解已经不知道被人发过多少次了。
所以,
能不能再想一种方法?
这个题不就是总数加起来比大小吗?
那我们可以用变量 maxs 来代表最大的奖学金,再用一个变量 maxn 来记名字。
这样也可以先输入的先判断,岂不是一举两得?
至少比上一个代码量少。
上代码(无需任何函数):
1 #include<iostream> 2 #include<string> 3 using namespace std; 4 int main(){ 5 int n,q,b,l,s,maxs=-1,tot=0; 6 char x,w; 7 string name,maxn; 8 cin>>n; 9 for(int i=1;i<=n;i++){ 10 s=0;//不要忘记每次都清零 11 cin>>name>>q>>b>>x>>w>>l; 12 if(q>80&&l>=1) s+=8000; 13 if(q>85&&b>80) s+=4000; 14 if(q>90) s+=2000; 15 if(q>85&&w=='Y') s+=1000; 16 if(b>80&&x=='Y') s+=850;//还是那一些 17 tot+=s;//总数 18 if(maxs<s){ 19 maxs=s; 20 maxn=name;//奖学金最多的人名和奖学金数量 21 } 22 } 23 cout<<maxn<<endl<<maxs<<endl<<tot; 24 return 0;//华丽结束 25 }
总结:
这种题其实就是代码量稍大,它既没有像难题那样需要严密的算法,也没有像大部分代码需要注意细节。不要被这种题目的表象迷惑,只要认真读题、思考,就肯定能做出来。
这也是我写这篇题解的原因。
都看到这了,如果觉得还行就点个赞呗。毕竟这是本蒟蒻第一次写题解,球球了~~~