PTA 7-6 天梯赛团队总分 分数 20

“天梯赛”的竞赛题目一共有 15 道,分为 3 个梯级:

 基础级设 8 道题,其中 5 分、10 分、15 分、20 分的题各 2 道,满分为 100 分;题目编号相应为L1-XX取1,2,3,4,5,6,7,8,分别表示基础级的8道题,如L1-1表示基础级的第1题。

 进阶级设 4 道题,每道题 25 分,满分为 100 分;题目编号相应为L2-XX取1,2,3,4,分别表示进阶级的4道题,如L2-2表示进阶级的第2题。

 登顶级设 3 道题,每道题 30 分,满分为 90 分。题目编号相应为L3-XX取1,2,3,分别表示登顶级的3道题,如L3-2表示登顶级的第2题。

注:若对以上表述仍有不理解或者不清楚的,则请参考本套考题的题号与分值。

在我们校赛中,积分规则和正式天梯赛积分规则有些许不同,校赛的积分规则简化后如下:

  • 参赛者须独立按照严格的输入输出要求提交每一题的解题程序。程序须经过若干测试用例的测试,每个测试用例分配一定分数。每题的得分为通过的测试用例得分之和;整场比赛得分为各题得分之和。程序可反复提交,取最高分,提交错误不扣分。
  • 参赛者的个人总分由每题得分和先锋奖励组成。只有当该队员的基础题总分超过 60 分时,其进阶部分的题目分数(包括奖励)才被判为对其个人有效;当其进
    阶题总分超过 25 分时,其登顶部分的题目分数(包括奖励)才被判为对其个人有效。
  • 当一支参赛团队的基础题总分超过 300 分时,该队进阶部分的题目分数才被判为对团队有效;只有当其进阶题总分超过 125 分时,该队登顶部分的题目分数才被判为对团队有效。
  • 校赛中每个参赛团队由5名参赛者组成。

注:基础题是默认有效的。对个人/团队无效得分的部分视为0分。

 团队的基础题总分为所有队员在基础题的得分总和;

 团队的进阶题总分为所有队员在进阶题的得分总和;

 团队的登顶题总分为所有队员在登顶题的得分总和。

当队员在进阶题或登顶题的得分对个人来说是无效时,但是这部分仍然计入团队进阶题和登顶题得分,只有当团队基础题得分/进阶题得分达到了进阶条件,团队的进阶题得分/登顶题得分才能被判定为对团队有效。


 在竞赛的过程中你和你的队友都如此沉迷,以至于你们都忘记看实时榜单,比赛结束后你们只能通过提交记录计算你们团队每个人的得分以及团队总得分。具有团队精神的你想要亲自编写程序来解决这个问题。

  • 天梯赛是善良的,同一道题你可以多次提交,该题最终得分为多次提交的最高分(参考样例1)。

  • 若有些题没有提交记录,即该题记做0分。

同样因为一股神秘力量(可能来自参赛团队本身 只有自己团队的提交记录),本题不考虑先锋奖励

输入格式:

输入第一行给出一个非负整数N(0<=N<200),表示提交记录的数量。

接下来N行,每行给出一条提交记录的详细情况,其格式为:队员编号 题目编号 分数。你们队员的编号依次为1,2,3,4,5

题目保证所有的提交记录只有你们团队的记录,不会出现其他队伍的记录;同时,同一道题可能有多次提交。

输出格式:

一共输出6行。

第1行输出团队总得分。

接下来5行输出团队5个人每个人的成绩,按总分由高到低的顺序。若总分相同,则优先输出编号较小者。

输入样例1:

5
1 L1-1 5
1 L1-1 3
1 L1-1 4
1 L1-1 2
1 L1-1 1

输出样例1:

5
1 5
2 0
3 0
4 0
5 0

输入样例2:

22
1 L1-8 20
1 L1-7 20
1 L1-6 15
1 L1-5 15
2 L1-8 20
2 L1-7 20
2 L1-6 15
2 L1-5 15
3 L1-8 20
3 L1-6 15
3 L1-5 15
4 L1-8 20
4 L1-7 20
4 L1-6 15
4 L1-5 15
4 L1-4 10
4 L1-3 10
1 L1-4 10
1 L1-3 10
1 L1-2 5
5 L2-1 25
5 L2-2 25

输出样例2:

355
1 95
4 90
2 70
3 50
5 0

样例解释2:

5号队员虽然进阶题得到50分,但是他基础题得分为0,所以,对于5号队员个人来说,他的最后总得分为0;对于整个团队来说,团队的基础题部分得分为305,达到了进阶条件;5号选手在进阶部分的得分可以计入团队的进阶部分得分,所以团队最后的总得分为355。接下来请继续你的快乐作答!

很麻烦的一个数据分段单独处理

2024/3/12日更新代码,比去年的简短

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
const int N = 1e6+5;
int n,m,k,T;
map<int,map<string,int> >mp;
map<int,int>sc;
bool cmp(int a,int b){
	if(sc[a]!=sc[b]){
		return sc[a]>sc[b];
	}
	return a<b;
}
signed main(){
	cin >> n;
	vector<int>v;
	for(int i=1;i<=5;i++)v.pb(i);
	for(int i=1;i<=n;i++){
		int a ,c; string b;
		cin >> a >> b >> c ;
		mp[a][b]=max(mp[a][b],c);
	}
	int L1 = 0,L2=0,L3=0;
	for(auto i : mp){
		int l1=0,l2=0,l3=0;
		for(auto j : i.second){
			if(j.first[1]=='1'){
				L1+=j.second;
				l1+=j.second;
			}else if(j.first[1]=='2'){
				L2+=j.second;
				l2+=(l1>=60?j.second:0); 
			}else if(j.first[1]=='3'){
				L3+=j.second;
				l3+=(l1>=60? l2>=25?j.second : 0 :0);
			}
		}
		sc[i.first]=l1+l2+l3;
	}
	sort(v.begin(),v.end(),cmp);
	int ans = L1 ;
	if(L1>=300){
		ans+=L2;
		if(L2>=125)ans+=L3;
	}
	cout << ans << endl;
	for(auto i : v)cout << i << " " << sc[i] << endl;
	return 0 ;
}

下面是去年写的

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,m,t,k;
map<int,map<string,int> >mp1;
map<int,map<string,int> >mp2;
map<int,map<string,int> >mp3;
map<int,int>la;
map<int,int>zf;
bool cmp(int a,int b){
	if(zf[a]!=zf[b])return zf[a]>zf[b];
	return a<b;
}
signed main(){
	cin >> n;
	int a,b;
	string c;
	for(int i=0;i<n;i++){
		cin >> a >> c >> b;
		if(c[1]=='1'){
			mp1[a][c]=max(mp1[a][c],b);
		}else if(c[1]=='2'){
			mp2[a][c]=max(mp2[a][c],b);
		}else{
			mp3[a][c]=max(mp3[a][c],b);
		}
	}
	vector<int>g;
	for(int i=1;i<=5;i++){
		g.push_back(i);
	}
	int sum=0;
	int gr=0;
	for(auto it : mp1){
		gr=0;
		for(auto i : it.second){
			sum+=i.second;
			gr+=i.second;
		}
		zf[it.first]=gr;
	}
		int sum1=0;
		for(auto it : mp2){
			gr=0;
			for(auto i : it.second){
				sum1+=i.second;
				gr+=i.second;
			}
			if(zf[it.first]>=60){
				la[it.first]=gr;
				zf[it.first]+=gr;
			}
		}
			int sum2=0;
			for(auto it : mp3){
				gr=0;
				for(auto i : it.second){
					sum2+=i.second;
					gr+=i.second;
				}
				if(zf[it.first]>=60&&la[it.first]>=25){
					zf[it.first]+=gr;
				}
			}
	if(sum>=300){
		if(sum1>=125){
			cout << sum+sum1+sum2 << endl;
		}else{
			cout << sum+sum1 << endl;
		}
	}else{
		cout << sum << endl;
	}
	sort(g.begin(),g.end(),cmp);
	for(int i=0;i<g.size();i++){
		cout << g[i] << " " << zf[g[i]] << endl;
	}
	return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值