题干:1146 Topological Order (25 分),1145 Hashing - Average Search Time (25 分)
- 题解:这两题,我自己写的答案完全错误理解了题干里面的意思。。。或者说我对哈希的平方散列法和图的拓扑排序只是凭借我单单阅读题干的认识,我原先以为考PAT这些知识点是超纲的,看来我可能需要再去学一点数据结构的理论课再过来做题。。。我按照自己的意思理解下来还写的挺开心的,而且写的也挺顺的,如果我会理解这两个概念,我这两道题是完全能够独立完成的,现在赶紧去补课。。。。话说回来,我做晚做哈希的那道题时,后面心态都崩了,早上起来换了一题,心态又崩了,因为原先都是以为很顺就能写完的题,最后发现做的南辕北辙。。。
- 这两题虽然没做出来,但是我还是坚持向各位强烈推荐visual studio,如果没有它强大的调试能力,我是不可能这么快的定位错误发生的位置,理解导致错误发生的原因。
- 如果这两题是在dev这种IDE里面完成的,我连错在哪里都不知道,一个是不支持vector和string,或者说STL结构的调试,这点对于PAT非常非常不友好,还有就是不支持自动变量和强大的监视和静态代码检查。。。。你用dev进行调试,可能你大半天都在改一些非常基础的语法错误,代码的逻辑错在哪里你根本就没有机会去认识到。
// A1146.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <bits/stdc++.h>
using namespace std;
#define max 1010
vector<vector<int>> gn(max,vector<int>(max,0));
vector<int> an;
vector<int> seq;
int main()
{
#ifndef ONLINE_JUDGE
#pragma warning(disable:4996)
freopen("in.txt", "r", stdin);
#endif // !ONLINE_JUDGE
int n, m,k;
cin >> n>>m;
//gn.resize(n + 1);
int start, end;
for (int i = 0; i < m; i++) {
cin >> start >> end;
gn[start][end]=1;
}
cin >> k;
//int a;
seq.resize(n);
for (int i = 0; i < k; i++) {
for (int j = 0; j < n; j++) {
cin >> seq[j];
}
bool flag = true;
for (int j = 1; j < n; j++) {
if (gn[seq[j-1]][seq[j]] == 0) {
flag = false;
break;
}
}
if (flag==true) {
an.push_back(i);
}
}
for (int i = 0; i < an.size(); i++) {
if (i == 0) {
cout << an[i];
}
else {
cout << " " << an[i];
}
}
return 0;
}
1145 Hashing - Average Search Time (25 分)
// A1145.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <bits/stdc++.h>
using namespace std;
bool is_prime(int x) {
for (int i = 2; i <= sqrt(x); i++) {
if (x % i == 0) {
return false;
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
#pragma warning(disable:4996)
freopen("in.txt", "r", stdin);
#endif // !ONLINE_JUDGE
int ms, m, n;
cin >> ms >> n >> m;
for (int i = ms; i <= 10000; i++) {
if (is_prime(i)) {
ms = i;
break;
}
}
vector<int> hn(ms,INT_MAX);
hn.resize(ms); int t,p;
for (int i = 0; i < n; i++) {
cin >> t;
if (hn[t % ms] == INT_MAX) {
hn[t % ms] = t;
}
else {
if (hn[t % ms + 1] == INT_MAX) {
hn[t % ms+1] = t;
}
else {
printf("%d cannot be inserted.\n", t);
}
}
}
int count = 0;
for (int i = 0; i < m; i++) {
cin >> t;
if (hn[t % ms] == t) {
count++;
}
else {
if (hn[t % ms + 1] == t) {
count++;
}
else {
count++;
}
}
}
cout << (double)count / m << endl;
return 0;
}
//p = t % ms;
//bool flag = false;
//for (int j = p; j < ms; j++) {
// if (hn[j] == INT_MAX) {
// hn[j] = t;
// flag = true;
// break;
// }
//}
//if (flag == false) {
// printf("%d cannot be inserted.\n", t);
//}
拓扑排序的题解:我查阅了相关的资料,并且理解了别人的满分代码,然后进行了改写,我通过了案例,但是我最后就得了第2,3个测试点的分数,才4分,非常的奇怪。。。。但是也是在做题的过程中,我认识到这个PAT的分数的权重在最后的综合排名里面并不是很大,因为满分的话只有12分,我考60分的话也能拿7分,所以在考场上保持好心态即时的放弃一些很坑的地方去做自己会做的题是很重要而,60分的话,基本上可以接受不会做一题,然后其他的题目做了但是拿不了满分。。。
在改写原有的答案的过程中,我再次感受到了vs的强大调试能力,我给你们展示一段代码,这是改正以后的,原先错误的部分我写在了注释,但是这段代码在编写的时候,因为语法相关的问题,差不多报了5个错。。。。你说恐不恐怖,就几行的代码,但是有些通过静态语法检查出来了,有些通过断点调试抓出来了。。。。
这道题我还自己设计了一些测试的样例,但是比较简单,我的程序一样是能够通过的,就是不知道为什么到了oj上面变的那么惨烈
for (int i = 0; i < k; i++) {
bool flag = true;
vector<int> tin(in);//vector<int> tin(in,in+n+1);
for (int j = 0; j < n; j++) {
cin >> a;
if (tin[a] != 0) {//if (tin[j] != 0) {
flag = false;//flag==false
break;
}
for (auto it : gn[a])tin[it]--;//for (auto it : gn[i])tin[it]--;
}
if (flag==false) {// if (flag==true) {
an.push_back(i);
}
}
完整的新版题解
// A1146.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <bits/stdc++.h>
using namespace std;
#define max 1010
//vector<vector<int>> gn(max,vector<int>(max,0));
vector<int> gn[max];
vector<int> in(max,0);
vector<int> an;
//vector<int> seq;
int main()
{
#ifndef ONLINE_JUDGE
#pragma warning(disable:4996)
freopen("in.txt", "r", stdin);
#endif // !ONLINE_JUDGE
int n, m,k;
cin >> n>>m;
//gn.resize(n + 1);
int start, end;
for (int i = 0; i < m; i++) {
cin >> start >> end;
gn[start].push_back(end);
//gn[start][end]=1;
in[end]++;
}
cin >> k;
int a;
//seq.resize(n);
for (int i = 0; i < k; i++) {
bool flag = true;
vector<int> tin(in);
for (int j = 0; j < n; j++) {
cin >> a;
if (tin[a] != 0) {
flag = false;
break;
}
for (auto it : gn[a])tin[it]--;
}
if (flag==false) {
an.push_back(i);
}
}
for (int i = 0; i < an.size(); i++) {
if (i == 0) {
cout << an[i];
}
else {
cout << " " << an[i];
}
}
return 0;
}