day02:函數(shù)&遞歸&結(jié)構(gòu)體&sort(a,a+n,cmp);
day02:函數(shù)&遞歸&結(jié)構(gòu)體&sort(a,a+n,cmp);
函數(shù):其實(shí)就是將一個(gè)方法進(jìn)行封裝,方便下次調(diào)用,主要注意傳入?yún)?shù)與返回參數(shù)
#include<cmath>
floor(3.14) = 3 向下取整
ceil(3.14) = 4 向上取整
abs(-1) = 1 取絕對(duì)值
pow(2,3)=2*2*2 = 8
pow(a,n) n個(gè)a的乘積
遞歸:就是按照某一個(gè)規(guī)則進(jìn)行套娃的游戲,依賴于函數(shù)的嵌套,同時(shí)遞歸需要注意兩個(gè)點(diǎn):
-
遞歸出口:什么時(shí)候游戲結(jié)束,或者破壞了游戲規(guī)則
-
遞歸條件:什么繼續(xù)下次游戲,注意看是否需要打標(biāo)記
如:給出一個(gè)數(shù)n,遞歸輸出1-n
很容易對(duì)吧!直接for就可以,但是現(xiàn)在規(guī)定你必須用遞歸來做,怎么辦呢?
首先:確定一個(gè)遞歸表達(dá)式 dfs(int i){} // i 表示遞歸層數(shù),并用作結(jié)果輸出
找到遞歸出口:當(dāng)輸出結(jié)果為n,也就是i>n就停止
如果沒有找到遞歸出口,就繼續(xù)遞歸i+1
#include<bits/stdc++.h>
using namespace std;
int n;
void dfs(int i){
if(i>n) return;//遞歸出口
printf("%d ", i);
dfs(i+1); //繼續(xù)遞歸
}
int main(){
cin>>n; dfs(1);
return 0;
}
結(jié)構(gòu)體:
struct T{
string name; //屬性
int age;
int score1,score2,score3;
int sum(){ //行為
return score1+score2+score3;
}
}stu[100];
我們可以將它(T)看做一類人,而stu[100];就是這一類人中的100個(gè)人,他們具有相似的屬性(name,age,score)和行為(sum())
結(jié)構(gòu)體一般在泛型排序結(jié)合貪心的題型上使用,如:
給出5個(gè)人的信息(包括姓名,年齡,三門學(xué)科分?jǐn)?shù)),現(xiàn)在讓你按照三門學(xué)科總分進(jìn)行降序排序,如果總分相同則年齡小的在前面
#include<bits/stdc++.h>
using namespace std;
const int N=100, n=5;
struct T{
string name;
int age;
int score1,score2, score3;
int sum(){
return score1+score2+score3;
}
}stu[N];
//按照總分大小排序,如果總分相同按照年齡小大排序
bool cmp(T a, T b){
if(a.sum()!=b.sum()) return a.sum()>b.sum();
return a.age<b.age;
}
/*輸入樣例:
a 11 100 100 100
b 22 80 90 90
c 33 90 90 90
d 44 80 80 80
e 55 90 80 80
*/
int main(){
for(int i=0; i<n; i++){
cin>>stu[i].name>>stu[i].age>>stu[i].score1>>stu[i].score2>>stu[i].score3;
}
sort(stu, stu+n, cmp);
for(int i=0; i<n; i++){
cout<<stu[i].name<<" "<<stu[i].age<<" "<<stu[i].sum()<<endl;
}return 0;
}
1. B2134 質(zhì)數(shù)的和與積
【題目描述】?jī)蓚€(gè)質(zhì)數(shù)的和是 S,它們的積最大是多少?
輸入格式:一個(gè)不大于 10000 的正整數(shù) S,為兩個(gè)質(zhì)數(shù)的和。
輸出格式:一個(gè)整數(shù),為兩個(gè)質(zhì)數(shù)的最大乘積。數(shù)據(jù)保證有解。
輸入樣例:50
輸出樣例:589
題解:
#include<bits/stdc++.h>
using namespace std;
bool isPrime(int n) {
if(n<2) return false;
for(int i=2; i*i<=n; i++)
if(n%i==0) return false;
return true;
}
int main() {
int n,max=0; cin>>n;
for(int i=2; i<=n; i++) {
if(isPrime(i) && isPrime(n-i)) {
int num = i*(n-i);
if(max<num) max = num;//最大值
}
}
cout<<max; return 0;
}
2. P1255 數(shù)樓梯
【題目描述】樓梯有 N階,上樓可以一步上一階,也可以一步上二階。
編一個(gè)程序,計(jì)算共有多少種不同的走法。
輸入格式:一個(gè)數(shù)字,樓梯數(shù)。
輸出格式:輸出走的方式總數(shù)。
輸入樣例:4
輸出樣例:5
說明/提示:對(duì)于60% 的數(shù)據(jù),N≤50;對(duì)于100% 的數(shù)據(jù),N≤5000。
題解:這道題目需要使用高精度,所以按照long long能過40分就OK。
#include<iostream>
using namespace std;
long long dfs(int num){// 樓梯數(shù)
if(num==1) return 1;
else if(num==2) return 2;
return dfs(num-1)+dfs(num-2);
//dfs(i-1) --> 走一階樓梯
}
int main(){
int n=4; cin>>n;
cout<<dfs(n);
return 0;
}
3. P1706 全排列問題
【題目描述】按照字典序輸出自然數(shù) 11 到 nn 所有不重復(fù)的排列,即 nn 的全排列,要求所產(chǎn)生的任一數(shù)字序列中不允許出現(xiàn)重復(fù)的數(shù)字。
輸入格式:一個(gè)整數(shù) n(1≤n≤9)
輸出格式:由 1~n 組成的所有不重復(fù)的數(shù)字序列,每行一個(gè)序列。每個(gè)數(shù)字保留 5 個(gè)場(chǎng)寬
輸入樣例:3
輸出樣例:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
題解:
#include<bits/stdc++.h>
using namespace std;
const int N=1000;
int n=3;
int vis[N], a[N];
//遞歸選擇數(shù)據(jù)個(gè)數(shù)
void dfs(int k){
if(k>n){
for(int i=1; i<=n; i++){
cout<<setw(5)<<a[i];//輸出控制5個(gè)寬度
}cout<<endl;
return;
}
for(int i=1; i<=n; i++){
if(vis[i]==0){
vis[i]=1;
a[k]=i;
dfs(k+1);
vis[i]=0;//回溯到上一級(jí)
}
}
}
int main(){
cin>>n; dfs(1);
return 0;
}
4. P5740 【深基7.例9】最厲害的學(xué)生
【題目描述】現(xiàn)有 N(N≤1000) 名同學(xué)參加了期末考試,并且獲得了每名同學(xué)的信息:姓名(不超過 8 個(gè)字符的字符串,沒有空格)、語文、數(shù)學(xué)、英語成績(jī)(均為不超過 150 的自然數(shù))。總分最高的學(xué)生就是最厲害的,請(qǐng)輸出最厲害的學(xué)生各項(xiàng)信息(姓名、各科成績(jī))。如果有多個(gè)總分相同的學(xué)生,輸出靠前的那位。
輸入格式:先輸入數(shù)字 n,表示有n個(gè)學(xué)生,再輸入n行,每行包含學(xué)生姓名,語文、數(shù)學(xué)、英語成績(jī)
輸出格式:最厲害的學(xué)生各項(xiàng)信息(姓名、語文、數(shù)學(xué)、英語成績(jī))
輸入樣例:
3
senpai 114 51 4
lxl 114 10 23
fafa 51 42 60
輸出樣例:
senpai 114 51 4
題解:
#include<bits/stdc++.h>
using namespace std;
const int N=1e3;
struct T{
string name;
int a,b,c,id;
int sum(){
return a+b+c;
}
}stu[N];
bool cmp(T a, T b){
if(a.sum()!=b.sum()) return a.sum() > b.sum();//按照總分降序排序
return a.id < b.id; //總分相同,按照學(xué)號(hào)升序排序
}
int main() {
int n; cin>>n;
for(int i=0; i<n; i++){
stu[i].id = i;
cin>>stu[i].name>>stu[i].a>>stu[i].b>>stu[i].c;
}
sort(stu, stu+n, cmp);//自定義排序方式
int i=0;
cout<<stu[i].name<<" "<<stu[i].a<<" "<<stu[i].b<<" "<<stu[i].c;
return 0;
}
--------------------------------------
#include<bits/stdc++.h>//其實(shí)這道題目不用結(jié)構(gòu)體也能做-舒同學(xué)的解法
using namespace std;
string a[1001];
int b[1001][4],sum,maxb,maxa,n;//全局變量默認(rèn)初始化0
int main() {
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i]>>b[i][1]>>b[i][2]>>b[i][3];//信息輸入
sum=b[i][1]+b[i][2]+b[i][3];//總分求和
if(maxb<sum) {
maxb=sum;
maxa=i;
}
}
cout<<a[maxa]<<" "<<b[maxa][1]<<" "<<b[maxa][2]<<" "<<b[maxa][3];
return 0;
}
5. P5742 【深基7.例11】評(píng)等級(jí)
【題目描述】現(xiàn)有 N(N≤1000) 名同學(xué),每名同學(xué)需要設(shè)計(jì)一個(gè)結(jié)構(gòu)體記錄以下信息:學(xué)號(hào)(不超過 100000 的正整數(shù))、學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī)(分別是 0 到 100 的整數(shù))、綜合分?jǐn)?shù)(實(shí)數(shù))。每行讀入同學(xué)的姓名、學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī),并且計(jì)算綜合分?jǐn)?shù)(分別按照 70% 和 30% 權(quán)重累加),存入結(jié)構(gòu)體中。還需要在結(jié)構(gòu)體中定義一個(gè)成員函數(shù),返回該結(jié)構(gòu)體對(duì)象的學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī)的總分。
然后需要設(shè)計(jì)一個(gè)函數(shù),其參數(shù)是一個(gè)學(xué)生結(jié)構(gòu)體對(duì)象,判斷該學(xué)生是否“優(yōu)秀”。優(yōu)秀的定義是學(xué)業(yè)和素質(zhì)拓展成績(jī)總分大于140 分,且綜合分?jǐn)?shù)不小于 80 分。
輸入格式:
第一行一個(gè)整數(shù) N,接下來 N 行,每行 3 個(gè)整數(shù),依次代表學(xué)號(hào)、學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī)。
輸出格式:N 行,如果第 i 名學(xué)生是優(yōu)秀的,輸出 Excellent,否則輸出 Not excellent。
輸入樣例:
4
1223 95 59
1224 50 7
1473 32 45
1556 86 99
輸出樣例:
Excellent
Not excellent
Not excellent
Excellent
題解:
#include<bits/stdc++.h>
using namespace std;
struct T{
int id;
int s1,s2;//學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī)
double s3;//綜合分?jǐn)?shù)(實(shí)數(shù))
double sum1(){//學(xué)業(yè)成績(jī)和素質(zhì)拓展成績(jī)的總分
return s1+s2;
}
}stu[1000];
int main(){
int n; cin>>n;
for(int i=0; i<n; i++){
cin>>stu[i].id>>stu[i].s1>>stu[i].s2;
stu[i].s3=0.7*stu[i].s1+0.3*stu[i].s2;
}
for(int i=0; i<n; i++){
if(stu[i].sum1()>140 && stu[i].s3>=80){//優(yōu)生條件
cout<<"Excellent"<<endl;
}else{
cout<<"Not Excellent"<<endl;
}
} return 0;
}
6. P1093 [NOIP2007 普及組] 獎(jiǎng)學(xué)金
【題目描述】某小學(xué)最近得到了一筆贊助,打算拿出其中一部分為學(xué)習(xí)成績(jī)優(yōu)秀的前5名學(xué)生發(fā)獎(jiǎng)學(xué)金。期末,每個(gè)學(xué)生都有3門課的成績(jī):語文、數(shù)學(xué)、英語。先按總分從高到低排序,如果兩個(gè)同學(xué)總分相同,再按語文成績(jī)從高到低排序,如果兩個(gè)同學(xué)總分和語文成績(jī)都相同,那么規(guī)定學(xué)號(hào)小的同學(xué) 排在前面,這樣,每個(gè)學(xué)生的排序是唯一確定的。
任務(wù):先根據(jù)輸入的3門課的成績(jī)計(jì)算總分,然后按上述規(guī)則排序,最后按排名順序輸出前五名名學(xué)生的學(xué)號(hào)和總分。注意,在前5名同學(xué)中,每個(gè)人的獎(jiǎng)學(xué)金都不相同,因此,你必須嚴(yán)格按上述規(guī)則排序。例如,在某個(gè)正確答案中,如果前兩行的輸出數(shù)據(jù)(每行輸出兩個(gè)數(shù):學(xué)號(hào)、總分) 是:
7 279
5 279
這兩行數(shù)據(jù)的含義是:總分最高的兩個(gè)同學(xué)的學(xué)號(hào)依次是7號(hào)、5號(hào)。這兩名同學(xué)的總分都是 279 (總分等于輸入的語文、數(shù)學(xué)、英語三科成績(jī)之和) ,但學(xué)號(hào)為7的學(xué)生語文成績(jī)更高一些。如果你的前兩名的輸出數(shù)據(jù)是:
5 279
7 279
則按輸出錯(cuò)誤處理,不能得分。
輸入格式:
共n+1行
第1行為一個(gè)正整數(shù)n(n≤300),表示該校參加評(píng)選的學(xué)生人數(shù)。
第2到n+1行,每行有3個(gè)用空格隔開的數(shù)字,每個(gè)數(shù)字都在0到100之間。
第j行的3個(gè)數(shù)字依次表示學(xué)號(hào)為j-1的學(xué)生的語文、數(shù)學(xué)、英語的成績(jī)。
每個(gè)學(xué)生的學(xué)號(hào)按照輸入順序編號(hào)為1~n(恰好是輸入數(shù)據(jù)的行號(hào)減1)。
所給的數(shù)據(jù)都是正確的,不必檢驗(yàn)。
輸出格式:共5行,每行是兩個(gè)用空格隔開的正整數(shù),依次表示前5名學(xué)生的學(xué)號(hào)和總分。
輸入樣例:
6
90 67 80
87 66 91
78 89 91
88 99 77
67 89 64
78 89 98
輸出樣例:
6 265
4 264
3 258
2 244
1 237
題解:
#include<iostream>
#include<algorithm>
using namespace std;
const int N=310;
struct T{
int s1,s2,s3;//語文,數(shù)學(xué),英語成績(jī)
int id; //學(xué)號(hào)
int sum(){//總分
return s1+s2+s3;
}
}stu[N];
bool cmp(T a, T b){
if(a.sum()!=b.sum()) return a.sum()>b.sum();//總分降序排列
if(a.s1!=b.s1) return a.s1>b.s1;//語文成績(jī)降序排列
return a.id<b.id;//學(xué)號(hào)升序排列
}
int main() {
int n; cin>>n;
for(int i=0; i<n; i++){
cin>>stu[i].s1>>stu[i].s2>>stu[i].s3;
stu[i].id = i+1;//學(xué)號(hào)
}
sort(stu, stu+n, cmp);//自定義排序
for(int i=0; i<5; i++){//前5名
cout<<stu[i].id<<" "<<stu[i].sum()<<endl;
} return 0;
}
7. P1104 生日
【題目描述】cjf 君想調(diào)查學(xué)校OI組每個(gè)同學(xué)的生日,并按照從大到小的順序排序。
輸入格式:有2行,第1行為OI組總?cè)藬?shù)n,第2行至第n+1行分別是每人的姓名s、出生年y、月m、日d
輸出格式:有n行,即n個(gè)生日從大到小同學(xué)的姓名(如果有兩個(gè)同學(xué)生日相同,輸入靠后的同學(xué)先輸出)
輸入樣例:
3
Yangchu 1992 4 23
Qiujingya 1993 10 13
Luowen 1991 8 1
輸出樣例:
Luowen
Yangchu
Qiujingya
數(shù)據(jù)范圍:1<n<100,length(s)<20
題解:
#include<iostream>
#include<algorithm>
using namespace std;
struct T{
string name;
int y,m,d;//year,month,day
int id; //輸入先后順序
}stu[110];
bool cmp(T a, T b){
if(a.y!=b.y) return a.y<b.y;//如果年份不同,按年份升序排序
if(a.m!=b.y) return a.m<b.m;//如果月份不同,按月份升序排序
if(a.d!=b.d) return a.d<b.d;//如果天數(shù)不同,按天數(shù)升序排序
return a.id>b.id; //按輸入順序,逆序排序
}
int main() {
int n; cin>>n;
for(int i=0; i<n; i++){
cin>>stu[i].name>>stu[i].y>>stu[i].m>>stu[i].d;
stu[i].id = i;
}
sort(stu, stu+n, cmp);//自定義排序規(guī)則
for(int i=0; i<n; i++){
cout<<stu[i].name<<endl;
} return 0;
}
8. P1068 [NOIP2009 普及組] 分?jǐn)?shù)線劃定
【題目描述】世博會(huì)志愿者的選拔工作正在 A 市如火如荼的進(jìn)行。為了選拔最合適的人才,AA市對(duì)所有報(bào)名的選手進(jìn)行了筆試,筆試分?jǐn)?shù)達(dá)到面試分?jǐn)?shù)線的選手方可進(jìn)入面試。面試分?jǐn)?shù)線根據(jù)計(jì)劃錄取人數(shù)的150%劃定,即如果計(jì)劃錄取m名志愿者,則面試分?jǐn)?shù)線為排名第m×150%(向下取整)名的選手的分?jǐn)?shù),而最終進(jìn)入面試的選手為筆試成績(jī)不低于面試分?jǐn)?shù)線的所有選手。
現(xiàn)在就請(qǐng)你編寫程序劃定面試分?jǐn)?shù)線,并輸出所有進(jìn)入面試的選手的報(bào)名號(hào)和筆試成績(jī)。
輸入格式:
第一行,兩個(gè)整數(shù) n,m(5≤n≤5000,3≤m≤n),中間用一個(gè)空格隔開,其中 n表示報(bào)名參加筆試的選手總數(shù),m表示計(jì)劃錄取的志愿者人數(shù)。輸入數(shù)據(jù)保證 m×150%向下取整后小于等于 n。
第二行到第 n+1 行,每行包括兩個(gè)整數(shù),中間用一個(gè)空格隔開,分別是選手的報(bào)名號(hào) k(1000≤k≤9999)和該選手的筆試成績(jī) s(1≤s≤100)。數(shù)據(jù)保證選手的報(bào)名號(hào)各不相同。
輸出格式:
第一行,有2個(gè)整數(shù),用一個(gè)空格隔開,第一個(gè)整數(shù)表示面試分?jǐn)?shù)線;第二個(gè)整數(shù)為進(jìn)入面試的選手的實(shí)際人數(shù)。
從第二行開始,每行包含2個(gè)整數(shù),中間用一個(gè)空格隔開,分別表示進(jìn)入面試的選手的報(bào)名號(hào)和筆試成績(jī),按照筆試成績(jī)從高到低輸出,如果成績(jī)相同,則按報(bào)名號(hào)由小到大的順序輸出。
輸入樣例:
6 3
1000 90
3239 88
2390 95
7231 84
1005 95
1001 88
輸出樣例:
88 5
1005 95
2390 95
1000 90
1001 88
3239 88
題解:
#include<bits/stdc++.h>
using namespace std;
const int N=1e4;
struct T{
int k,s;
}stu[N];
bool cmp(T a, T b){
if(a.s!=b.s) return a.s>b.s;//按成績(jī)降序排列
return a.k<b.k;//按成績(jī)升序排列
}
int main(){
int n,m; cin>>n>>m;
int num=floor(m*1.5);//參與面試的人數(shù)
for(int i=1; i<=n; i++){
cin>>stu[i].k>>stu[i].s;
}
sort(stu+1, stu+n+1, cmp);
int score=0, ans=0;//最后進(jìn)入面試的分?jǐn)?shù),人數(shù)
for(int i=1; i<=n; i++){
if(i<=num || stu[i].s==score){
ans++;
score=stu[i].s;
}else{
break;
}
}
cout<<score<<" "<<ans<<endl;
for(int i=1; i<=ans; i++){
cout<<stu[i].k<<" "<<stu[i].s<<endl;
}return 0;
}
9. P1051 [NOIP2005 提高組] 誰拿了最多獎(jiǎng)學(xué)金
【題目描述】 某校的慣例是在每學(xué)期的期末考試之后發(fā)放獎(jiǎng)學(xué)金。發(fā)放的獎(jiǎng)學(xué)金共有五種,獲取的條件各自不同:
院士獎(jiǎng)學(xué)金,每人8000元,期末平均成績(jī)高于80分(>80),并且在本學(xué)期內(nèi)發(fā)表1篇或1篇以上論文的學(xué)生均可獲得;
五四獎(jiǎng)學(xué)金,每人4000元,期末平均成績(jī)高于85分(>85),并且班級(jí)評(píng)議成績(jī)高于80分(>80)的學(xué)生均可獲得;
成績(jī)優(yōu)秀獎(jiǎng),每人2000元,期末平均成績(jī)高于90分(>90)的學(xué)生均可獲得;
西部獎(jiǎng)學(xué)金,每人1000元,期末平均成績(jī)高于85分(>85)的西部省份學(xué)生均可獲得;
班級(jí)貢獻(xiàn)獎(jiǎng),每人850元,班級(jí)評(píng)議成績(jī)高于80分(>80)的學(xué)生干部均可獲得;
只要符合條件就可以得獎(jiǎng),每項(xiàng)獎(jiǎng)學(xué)金的獲獎(jiǎng)人數(shù)沒有限制,每名學(xué)生也可以同時(shí)獲得多項(xiàng)獎(jiǎng)學(xué)金。例如姚林的期末平均成績(jī)是87分,班級(jí)評(píng)議成績(jī)82分,同時(shí)他還是一位學(xué)生干部,那么他可以同時(shí)獲得五四獎(jiǎng)學(xué)金和班級(jí)貢獻(xiàn)獎(jiǎng),獎(jiǎng)金總數(shù)是4850元。
現(xiàn)在給出若干學(xué)生的相關(guān)數(shù)據(jù),請(qǐng)計(jì)算哪些同學(xué)獲得的獎(jiǎng)金總數(shù)最高(假設(shè)總有同學(xué)能滿足獲得獎(jiǎng)學(xué)金的條件)。
輸入格式:
第一行是1個(gè)整數(shù)N(1≤N≤100),表示學(xué)生的總數(shù)。
接下來的NN行每行是一位學(xué)生的數(shù)據(jù),從左向右依次是姓名,期末平均成績(jī),班級(jí)評(píng)議成績(jī),是否是學(xué)生干部,是否是西部省份學(xué)生,以及發(fā)表的論文數(shù)。姓名是由大小寫英文字母組成的長(zhǎng)度不超過20的字符串(不含空格);期末平均成績(jī)和班級(jí)評(píng)議成績(jī)都是0到100之間的整數(shù)(包括0和100);是否是學(xué)生干部和是否是西部省份學(xué)生分別用1個(gè)字符表示,Y表示是,N表示不是;發(fā)表的論文數(shù)是0到1010的整數(shù)(包括0和10)。每?jī)蓚€(gè)相鄰數(shù)據(jù)項(xiàng)之間用一個(gè)空格分隔。
輸出格式:
包括3行,第1行是獲得最多獎(jiǎng)金的學(xué)生的姓名。
第2行是這名學(xué)生獲得的獎(jiǎng)金總數(shù)。如果有兩位或兩位以上的學(xué)生獲得的獎(jiǎng)金最多,輸出他們之中在輸入文件中出現(xiàn)最早的學(xué)生的姓名。
第3行是這N個(gè)學(xué)生獲得的獎(jiǎng)學(xué)金的總數(shù)。
輸入樣例:
4
YaoLin 87 82 Y N 0
ChenRuiyi 88 78 N Y 1
LiXin 92 88 N N 0
ZhangQin 83 87 Y N 1
輸出樣例:
ChenRuiyi
9000
28700
題解:這道題就是使用結(jié)構(gòu)體來排序,并且多了一下判斷條件,需要注意細(xì)節(jié)
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+5; //定義常量N
struct T{
int id;
string name;
int score1,score2,num;
char flag1,flag2;
int money(){
int sum=0;
if(score1>80 && num>=1) sum+=8000;
if(score1>85 && score2>80) sum+= 4000;
if(score1>90) sum += 2000;
if(score1>85 && flag2=='Y') sum += 1000;
if(score2>80 && flag1=='Y') sum += 850;
return sum;
}
}stu[N];
bool cmp(T a, T b){//自定義排序規(guī)則
if(a.money() !=b.money()){
return a.money() > b.money();//獲得獎(jiǎng)學(xué)金最多的同學(xué)在前
}
return a.id < b.id;//按學(xué)號(hào)升序排序
}
int main(){
int n; cin>>n;
for(int i=0; i<n; i++){
cin>>stu[i].name>>stu[i].score1
>>stu[i].score2>>stu[i].flag1
>>stu[i].flag2>>stu[i].num;
stu[i].id = i;
}
sort(stu, stu+n, cmp);//自定義排序,注意下標(biāo)
int sum=0;
for(int i=0; i<n; i++){
sum += stu[i].money();//獎(jiǎng)學(xué)金總數(shù)
}
cout<<stu[0].name<<endl<<stu[0].money()<<endl;
cout<<sum<<endl; return 0;
}

浙公網(wǎng)安備 33010602011771號(hào)