PAT 2021秋季题解
7-1(11分代码)
#include "bits/stdc++.h"
using namespace std;
struct node
{
long long int addr;
long long int len;
};
vector<node> v;
map<long long int, int> mp;
int main()
{
int n, m;
cin >> n >> m;
v.resize(n+1);
long long int sum = 0;
for (size_t i = 1; i <= n; i++)
{
int ad, len;
cin >> ad >> len;
if (len == 0) continue;
sum += len;
v[i] = { ad,len };
mp[sum] = i;
}
set<int> s;
for (size_t i = 0; i < m; i++)
{
long long int elem;
cin >> elem;
long long int idx = 0,curSum = 0;
bool flag = false;
for (auto it : mp) {
if (elem < it.first) {
idx = it.second;
flag = true;
s.insert(idx);
//cout << idx << endl;
break;
}
curSum = it.first;
}//找index
if (flag) {
long long int adr = v[idx].addr;
long long int len = v[idx].len;
printf("%lld\n", adr + ((elem - curSum)%len) * 4);
}
else cout << "Illegal Access" << endl;
}
cout << s.size() << endl;
return 0;
}
7-2 (AC代码)
#include "bits/stdc++.h"
using namespace std;
vector<int> ohat, oweight;
vector<int> shat, sweight;
bool cmp(int a, int b)
{
return a > b;
}
int find(int x,vector<int> v,int flag)
{
int res = 0;
for (int i = 0; i < v.size(); i++) {
if (x == v[i]) {
res = i;
}
}
if (flag%2==0) {
return res + 1;//找第几大,v是按大到小排好序
}
else {
return v.size() - res;//找第几小
}
}
int find2(int idx, vector<int> v, int flag)
{
if (flag % 2 == 1) idx = v.size() + 1 - idx;
for (size_t i = 0; i < v.size(); i++)
{
if (i + 1 == idx) {
for (size_t j = 0; j < v.size(); j++)
{
if (v[i] == oweight[j]) return j + 1;
}
}
}
}
int main()
{
int n;
cin >> n;
ohat.resize(n);
oweight.resize(n);
for (size_t i = 0; i < n; i++) cin >> ohat[i];
for (size_t i = 0; i < n; i++) cin >> oweight[i];
shat = ohat;
sweight = oweight;
sort(shat.begin(), shat.end(), cmp);
sort(sweight.begin(), sweight.end(), cmp);
int flag = 0;
vector<int> idx;
for (int i = n - 1; i >= 0; i--)
{
idx.push_back(find(ohat[i], shat, flag++));
}
flag = 0;
for (size_t i = 0; i < n; i++)
{
int t = idx[i];
if (i != 0) cout << " ";
cout << find2(t, sweight, flag++);
}
return 0;
}
7-3 (AC代码)
#include "bits/stdc++.h"
using namespace std;
struct node
{
int val;
int pri;
int index;
};
int n;
vector<int> in;
vector<node>v;
vector<node> ans;
bool cmp(node a, node b)
{
if (a.index != b.index) return a.index < b.index;
}
bool cmp1(node a, node b)
{
if (a.val != b.val) return a.val < b.val;
}
void levelOrder(int inL,int inR,int index)
{
//find root
if (inL > inR) return;
int i = inL;
int minPri = 100000;
int minIdx = -1;
for (size_t i = inL; i < inR; i++)
{
if (v[i].pri < minPri) {
minPri = v[i].pri;
minIdx = i;
}
}
if (minIdx == -1) return;
v[minIdx].index = index;
ans.push_back(v[minIdx]);
levelOrder(inL, minIdx, 2 * index);
levelOrder(minIdx + 1, inR, 2 * index + 1);
}
int main()
{
cin >> n;
for (size_t i = 0; i < n; i++)
{
int val, pri;
cin >> val >> pri;
v.push_back({ val,pri });
}
sort(v.begin(), v.end(), cmp1);
for (size_t i = 0; i < n; i++)
{
in.push_back(v[i].pri);
}
levelOrder(0, n, 1);
sort(ans.begin(), ans.end(), cmp);
for (size_t i = 0; i < ans.size(); i++)
{
if (i != 0) cout << " ";
cout << ans[i].val;
}
cout << endl;
for (size_t i = 0; i < ans.size(); i++)
{
if (i != 0) cout << " ";
cout << ans[i].pri;
}
return 0;
}
7-4 (AC代码)
#include "bits/stdc++.h"
using namespace std;
const int MAXV = 105;
int n, m;
vector<int> adj[MAXV];
int maxDp;
bool vis[MAXV] = { false };
bool cmp(int a, int b)
{
return a < b;
}
void dfs(int u,int depth)
{
bool flag = false;
for (size_t i = 0; i < adj[u].size(); i++)
{
int v = adj[u][i];
if (!vis[v]) {
flag = true;
break;
}
}
//printf("cur vis:%d D:%d\n", u, depth);
if (!flag) {
if (depth > maxDp) {
maxDp = depth;
return;
}
}
vis[u] = true;
for (size_t i = 0; i < adj[u].size(); i++)
{
int v = adj[u][i];
if (!vis[v]) {
dfs(v, depth + 1);
break;
}
}
}
int main()
{
cin >> n >> m;
for (size_t i = 0; i < m; i++)
{
int a, b;
cin >> a >> b;
adj[a].push_back(b);
adj[b].push_back(a);
}
for (int i = 1; i <= n; i++) {
sort(adj[i].begin(), adj[i].end(), cmp);
}
int rMaxDp = -1;
vector<int> ans;
for (size_t i = 1; i <=n ; i++)
{
maxDp = -1;
fill(vis, vis + MAXV, false);
//cout << i << endl;
dfs(i, 1);
if (maxDp > rMaxDp) {
rMaxDp = maxDp;
ans.clear();
ans.push_back(i);
}
else if (maxDp == rMaxDp) {
ans.push_back(i);
}
}
cout << ans[0] << " " << rMaxDp << endl;
return 0;
}