PAT甲级1074,1075解题报告

49 篇文章 0 订阅
47 篇文章 0 订阅

1074 Reversing Linked List (25 point(s))

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:

Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10​5​​) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next

where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:

For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

题目大意:链表反转。

解题思路:其实挺水,有个坑就是反转的时候要注意。不一定是反转一次的,可能反转多次,他的意思不是前K个反转一次,而是每K个反转一次。

代码如下

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<time.h>
#include<math.h>
#include<set>
#include<list>
#include<climits>
#include<queue>
#include<cstring>
#include<map>
#include<stack>
#include<string>
using namespace std;
struct Node {
	int addr;
	int data;
	int next;
};
map<int, Node> a;
vector<Node> res;
int main() {
	int begin; int N, K;
	scanf("%d %d %d", &begin,&N,&K);
	for (int i = 0; i < N; i++) {
		Node tmp;
		scanf("%d %d %d", &tmp.addr, &tmp.data, &tmp.next);
		a[tmp.addr] = tmp;
	}
	while (true) {
		if (begin == -1)break;
		res.push_back(a[begin]);
		begin = a[begin].next;
	}
	int kao = 0;
	for (int i = 0; i < res.size() / K; i++) {
		reverse(res.begin() + kao, res.begin() + kao + K);
		kao = kao+K;
	}
	for (int i = 0; i < res.size(); i++) {
		if (i != res.size()-1)
		printf("%05d %d %05d\n",res[i].addr,res[i].data,res[i+1].addr);
		else
		printf("%05d %d -1\n", res[i].addr, res[i].data);

	}
	return 0;
}

1075 PAT Judge (25 point(s))

The ranklist of PAT is generated from the status list, which shows the scores of the submissions. This time you are supposed to generate the ranklist for PAT.

Input Specification:

Each input file contains one test case. For each case, the first line contains 3 positive integers, N (≤10​4​​), the total number of users, K (≤5), the total number of problems, and M (≤10​5​​), the total number of submissions. It is then assumed that the user id's are 5-digit numbers from 00001 to N, and the problem id's are from 1 to K. The next line contains K positive integers p[i] (i=1, ..., K), where p[i] corresponds to the full mark of the i-th problem. Then M lines follow, each gives the information of a submission in the following format:

user_id problem_id partial_score_obtained

where partial_score_obtained is either −1 if the submission cannot even pass the compiler, or is an integer in the range [0, p[problem_id]]. All the numbers in a line are separated by a space.

Output Specification:

For each test case, you are supposed to output the ranklist in the following format:

rank user_id total_score s[1] ... s[K]

where rank is calculated according to the total_score, and all the users with the same total_score obtain the same rank; and s[i] is the partial score obtained for the i-th problem. If a user has never submitted a solution for a problem, then "-" must be printed at the corresponding position. If a user has submitted several solutions to solve one problem, then the highest score will be counted.

The ranklist must be printed in non-decreasing order of the ranks. For those who have the same rank, users must be sorted in nonincreasing order according to the number of perfectly solved problems. And if there is still a tie, then they must be printed in increasing order of their id's. For those who has never submitted any solution that can pass the compiler, or has never submitted any solution, they must NOT be shown on the ranklist. It is guaranteed that at least one user can be shown on the ranklist.

Sample Input:

7 4 20
20 25 25 30
00002 2 12
00007 4 17
00005 1 19
00007 2 25
00005 1 20
00002 2 2
00005 1 15
00001 1 18
00004 3 25
00002 2 25
00005 3 22
00006 4 -1
00001 2 18
00002 1 20
00004 1 15
00002 4 18
00001 3 4
00001 4 2
00005 2 -1
00004 2 0

Sample Output:

1 00002 63 20 25 - 18
2 00005 42 20 0 22 -
2 00007 42 - 25 - 17
2 00001 42 18 18 4 2
5 00004 40 15 0 25 -

题目大意:模拟一下PAT考试的排名

解题思路:坑死!怎么搞都过不去最后一个样例,找了别人的代码来交只能,先说下我的想法,其实就是正常人做的模拟,用一个id关联到结构体数组,然后最后一个样例一直超时,然后我发现。。map虽然当key不存在的时候会自动创建一个对应的value,但是这个过程是极为耗时的,所以要在一开始初始化,但是初始化完成后,超时是不超时了,开始WA了。。不知道为什么,我现在想想可能是因为存在一种很多人,但是没有一个人能上榜的情况,这样我的代码是跑不了的,当然只是猜测。我也很绝望。

我的代码:

#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
#include<iomanip>
#include<time.h>
#include<math.h>
#include<set>
#include<list>
#include<climits>
#include<queue>
#include<cstring>
#include<map>
#include<stack>
#include<string>
using namespace std;
int K;
struct stu {
	int id;
	map<int, int> score;
	bool flag=false;
	int solans = 0;
	int total = 0;
	//map<int, bool> ansp;
	int index;
		
	stu() :flag(false){
		for (int i = 0; i < K; i++) {
		score[i + 1] = -1;
	    }
	}
};
int pro[6];
vector<stu> res;
map<int, stu> lt;
bool cmp(stu a, stu b) {
	if (a.total > b.total) {
		return true;
	}
	else if (a.total == b.total) {
		if (a.solans > b.solans) {
			return true;
		}
		else if (a.solans == b.solans) {
			return a.id < b.id;
		}
		else
			return false;
	}
	else {
		return false;
	}
}
int main() {
	int N, M;
	scanf("%d %d %d",&N,&K,&M);
	for (int i = 0; i < N; i++) {
		stu a;
		lt[i + 1] = a;
	}
	for (int i = 0; i < K; i++)scanf("%d", &pro[i]);
	for (int i = 0; i < M; i++) {
		int tmpid;
		int tmpto;
		int tmpsco;
		scanf("%d %d %d", &tmpid, &tmpto, &tmpsco);
			if (tmpsco == -1) {
				lt[tmpid].id = tmpid;
				//lt[tmpid].ansp[tmpto] = true;
				lt[tmpid].score[tmpto] = 0;
			}
			else {
				lt[tmpid].id = tmpid;
				//lt[tmpid].ansp[tmpto] = true;
				if (lt[tmpid].score[tmpto] < tmpsco) {
					//lt[tmpid].total = lt[tmpid].total - lt[tmpid].score[tmpto] + tmpsco;
					lt[tmpid].score[tmpto] = tmpsco;
				}
				if (lt[tmpid].score[tmpto] == pro[tmpto - 1])
					lt[tmpid].solans += 1;
				lt[tmpid].flag = true;
			}
	}
	for (auto i = lt.begin(); i != lt.end(); i++) {
		if (i->second.flag) {
			for (int j = 0; j < K; j++) {
				if(i->second.score[j + 1]!=-1)
				i->second.total += i->second.score[j + 1];
			}
			res.push_back(i->second);
		}
	}
	sort(res.begin(), res.end(), cmp);
	int index;
	res[0].index = 1;
	for (int i = 1; i < res.size(); i++) {
		if (res[i].total < res[i - 1].total) {
			index = i + 1;
			res[i].index = index;
		}
		else {
			res[i].index = index;
		}
	}
	for (int i = 0; i < res.size(); i++) {
		printf("%d %05d %d ", res[i].index,res[i].id,res[i].total);
		for (int j = 1; j <=K; j++) {
			if (res[i].score[j]!=-1) {
				printf("%d", res[i].score[j]);
			}
			else {
				printf("-");
			}
			if (j != K)
				printf(" ");
			else
				printf("\n");
		}
	}
	return 0;
}

别人的满分代码

struct student {
    int id;
    int score[6];
    bool flag = false;
    int solve = 0;
    int total = 0;
}s[10010];

bool cmp(student a, student b) {
    if (a.total != b.total) return a.total > b.total;
    else if (a.solve != b.solve) return a.solve > b.solve;
    else return  a.id < b.id;
}

int main() {
    int n, k, m, i;
    scanf("%d %d %d", &n, &k, &m);
    int p[6];
    for (i = 1; i <= k; i++) {
        scanf("%d", &p[i]);
    }
    for ( i = 1; i <= n; i++) {//我还是不知道,在我输入id之后,再赋值s[id].id=id为什么最后一个测试点过不了,必须在这里初始化
        s[i].id = i;
        memset(s[i].score, -1, sizeof(s[i].score));
     }

    int id, num, temp;
    for (i = 1; i <= m; i++) {
        scanf("%d %d %d", &id, &num, &temp);
        if (temp != -1) s[id].flag = true;
        if (temp == -1 && s[id].score[num] == -1) s[id].score[num] = 0;
        if (temp == p[num] && s[id].score[num] < p[num]) s[id].solve++;//这个语句要在下一个语句之前,不然temp已经存进去了
        if (temp > s[id].score[num]) s[id].score[num] = temp;

    }
    for (i = 1; i <= n; i++) {
        for (int j = 1; j <= k; j++) {
            if (s[i].score[j] != -1 ) s[i].total += s[i].score[j];
        }
    }
    sort(s + 1, s + n + 1, cmp);
    int r = 1;
    for (i = 1; i <= n && s[i].flag == true; i++) {//只输出能够输出的
        if (i > 1 && s[i].total != s[i - 1].total) r = i;
        printf("%d %05d %d", r, s[i].id, s[i].total);
        for (int j = 1; j <= k; j++) {
            if (s[i].score[j] == -1) printf(" -");
            else printf(" %d", s[i].score[j]);
        }
        printf("\n");
    }
    return 0;
}

自闭了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值