专栏首页刷题笔记2 PAT排名汇总 (25分)注意 不要使用 long long int

2 PAT排名汇总 (25分)注意 不要使用 long long int

计算机程序设计能力考试(Programming Ability Test,简称PAT)旨在通过统一组织的在线考试及自动评测方法客观地评判考生的算法设计与程序设计实现能力,科学的评价计算机程序设计人才,为企业选拔人才提供参考标准(网址http://www.patest.cn)。

每次考试会在若干个不同的考点同时举行,每个考点用局域网,产生本考点的成绩。考试结束后,各个考点的成绩将即刻汇总成一张总的排名表。

现在就请你写一个程序自动归并各个考点的成绩并生成总排名表。

输入格式:

输入的第一行给出一个正整数N(≤100),代表考点总数。随后给出N个考点的成绩,格式为:首先一行给出正整数K(≤300),代表该考点的考生总数;随后K行,每行给出1个考生的信息,包括考号(由13位整数字组成)和得分(为[0,100]区间内的整数),中间用空格分隔。

输出格式:

首先在第一行里输出考生总数。随后输出汇总的排名表,每个考生的信息占一行,顺序为:考号、最终排名、考点编号、在该考点的排名。其中考点按输入给出的顺序从1到N编号。考生的输出须按最终排名的非递减顺序输出,获得相同分数的考生应有相同名次,并按考号的递增顺序输出。

输入样例:

2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85

输出样例:

9
1234567890005 1 1 1
1234567890014 1 2 1
1234567890001 3 1 2
1234567890003 3 1 2
1234567890004 5 1 4
1234567890012 5 2 2
1234567890002 7 1 5
1234567890013 8 2 3
1234567890011 9 2 4

全部输入后再排序最大 测试点是答案错误不是超时内存超限。。。

我也一时半会儿查不出来

补充:错误很可能是long long 类型导致的,longlong不是精准数据类型,sort可能出错误,改为string 即可通过。

改正后代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
struct stu{
	string id;
	int score;
	int kc;
	int kcpm;
	int zpm;
};
bool cmp0(stu s1,stu s2){
	if(s1.kc==s2.kc){
		return s1.score>s2.score;
	}else return s1.kc<s2.kc;
}
bool cmp1(stu s1,stu s2){
	if(s1.score!=s2.score){
		return s1.score>s2.score;
	}return s1.id<s2.id;
}
vector<stu>st;
int main(){
	long long int n;
	cin>>n; 
	for(int i=0;i<n;i++){
		int p;
		cin>>p;
		for(int j=0;j<p;j++){
			string a;
			int b;
			cin>>a>>b;
			stu s;
			s.id=a;
			s.score=b;
			s.kc=i+1;
			st.push_back(s);
		}
	}
	sort(st.begin(),st.end(),cmp0);
	int count=1;
	for(int i=0;i<st.size();i++){
		if(i>0&&st[i].kc!=st[i-1].kc){
			count=1;
		}
		st[i].kcpm=count++;
		if(i>0&&st[i].kc==st[i-1].kc&&st[i].score==st[i-1].score){
			st[i].kcpm=st[i-1].kcpm;
		}
	}
	sort(st.begin(),st.end(),cmp1);
	cout<<st.size()<<endl;
	count=1;
	for(int i=0;i<st.size();i++){
		st[i].zpm=count++;
		if(i>0&&st[i].score==st[i-1].score){
			st[i].zpm=st[i-1].zpm;
		}
		cout<<st[i].id<<" "<<st[i].zpm<<" "<<st[i].kc<<" "<<st[i].kcpm<<endl;
	}
	return 0;
}

改正前 long long int 数据代码

#include<iostream>
#include<vector>
#include<algorithm>

using namespace std;
struct stu{
	long long int id;
	int score;
	int kc;
	int kcpm;
	int zpm;
};
bool cmp0(stu s1,stu s2){
	if(s1.kc!=s2.kc){
		return s1.kc>s2.kc;
	}else {
		return s1.score>s2.score;
	}
}
bool cmp1(stu s1,stu s2){
	if(s1.score!=s2.score){
		return s1.score>s2.score;
	}return s1.id<s2.id;
}
vector<stu>st;
int main(){
	long long int n;
	cin>>n; 
	for(int i=0;i<n;i++){
		int p;
		cin>>p;
		for(int j=0;j<p;j++){
			long long a,b;
			cin>>a>>b;
			stu s;
			s.id=a;
			s.score=b;
			s.kc=i+1;
			st.push_back(s);
		}
	}
	sort(st.begin(),st.end(),cmp0);
	int count=1;
	for(int i=0;i<st.size();i++){
		if(i>0&&st[i].kc!=st[i-1].kc){
			count=1;
		}
		st[i].kcpm=count++;
		if(i>0&&st[i].kc==st[i-1].kc&&st[i].score==st[i-1].score){
			st[i].kcpm=st[i-1].kcpm;
		}
	}
	sort(st.begin(),st.end(),cmp1);
	cout<<st.size()<<endl;
	count=1;
	for(int i=0;i<st.size();i++){
		st[i].zpm=count++;
		if(i>0&&st[i].score==st[i-1].score){
			st[i].zpm=st[i-1].zpm;
		}
		cout<<st[i].id<<" "<<st[i].zpm<<" "<<st[i].kc<<" "<<st[i].kcpm<<endl;
	}
	return 0;
}

抄了一个大佬答案过了

https://blog.csdn.net/xiang_6/article/details/78759565链接在这里

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 30000+7, INF = 0x7f7f7f7f;
int T, n;
struct node {
    string s;
    int sc, id, st, fst;
}a[maxn];
bool cmp(node a, node b) {
    if(a.sc == b.sc) return a.s < b.s;
    return a.sc > b.sc;
} 
int main() {
    scanf("%d", &T);
    int cnt = 0;
    for(int i = 1; i <= T; ++i) {
        scanf("%d", &n);
        string s; int x;
        for(int j = 0; j < n; ++j) {
            cin >> s >> x;
            a[cnt+j].s = s; a[cnt+j].sc = x; a[cnt+j].id = i;
        }
        sort(a+cnt, a+cnt+n, cmp);
        a[cnt].st = 1;
        for(int j = 1; j < n; ++j) {
            if(a[cnt+j].sc == a[cnt+j-1].sc) a[cnt+j].st = a[cnt+j-1].st;
            else a[cnt+j].st = j+1;
        }
        cnt += n;
    }
    sort(a, a+cnt, cmp);
    cout << cnt << endl;
    a[0].fst = 1;
    cout << a[0].s << " " << a[0].fst << " " << a[0].id << " " << a[0].st << endl;
    for(int i = 1; i < cnt; ++i) {
        if(a[i].sc == a[i-1].sc) a[i].fst = a[i-1].fst;
        else a[i].fst = i+1;
        cout << a[i].s << " " << a[i].fst << " " << a[i].id << " " << a[i].st << endl;
    }
    return 0;
}
/*
2
5
1234567890001 95
1234567890005 100
1234567890003 95
1234567890002 77
1234567890004 85
4
1234567890013 65
1234567890011 25
1234567890014 100
1234567890012 85
*/

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 【LeetCode程序员面试金典】面试题 10.01. Sorted Merge LCCI

    You are given two sorted arrays, A and B, where A has a large enough buffer at t...

    韩旭051
  • 【数据库】实验一 建表 和 插入

    韩旭051
  • 1053 住房空置率 (20 分)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。 ...

    韩旭051
  • linux添加定时任务crond

    crontab –e : 修改 crontab 文件,如果文件不存在会自动创建。 crontab –l : 显示 crontab 文件。 crontab...

    拓荒者
  • 洛谷P1316 丢瓶盖

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大...

    attack
  • IOS开发必须知道的3DLabel实现过程

    最近写了很多关于SceneKit 的入门教程文章,初衷就是想给应用增加一点色彩,今天就教大家实现一个简单的3DLabel 的小框架.如果你的应用中需要实现3D字...

    酷走天涯
  • Linux Top查看指定进程的CPU状态

    语法是下面这样,进入到交互界面后,用法类似vi,然后按「q」可以退出,输入「?」再输入关键字,可以查询相关关键字:

    叉叉敌
  • Linux Top查看指定进程的CPU状态

    不管linux还是unix,大多数命令都是支持man命令来查看帮助信息的。 语法是下面这样,进入到交互界面后,用法类似vi,然后按「q」可以退出,输入「?」再...

    叉叉敌
  • 简单的实现土味实时声音可视化

    声音可视化顾名思义,就是把听到声音,通过视觉的方法呈现出来,人不仅可以听见声音,同时也可以看见。声音可视化最早是人们用来分析和了解声音的一种研究方式,不...

    UDM Lab
  • 《JS正则表达式教程》汇总

    正则表达式,又称规则表达式。(英语:Regular Expression,在代码中常简写为regex、regexp或RE),计算机科学的一个概念。正则表通常被用...

    程序猿DD

扫码关注云+社区

领取腾讯云代金券