2021 PAT甲级秋季题解

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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值