pat 1140-1143

今天下午做了个模拟,99分,最后一题一个点超时,没办法了,希望明天能满分,90分的时候是4点,99分时候是4.20,想优化想了一会儿

1140:

这题一开始没看懂,把后面三题全做了才回来看的,意思就是用第n+1个数可以说出第n个数,很像递归有没有,举个例子,第n个字符串是122111的话,那么第n+1个就是1个1,2个2,3个1,即112213,以此类推

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
#include<set>
using namespace std;
int main()
{
	//freopen("test.txt", "r", stdin);
	string s;
	int n;
	cin >> s >> n;
	n--;
	while (n--)
	{
		string res;
		int len = s.length();
		int cnt = 1;
		char pre = s[0];
		
		for (int i = 1; i < len; ++i)
		{
			if (pre != s[i]) {
				res.push_back(pre);
				res.push_back(cnt + '0');
				cnt = 1;
				pre = s[i];
			}
			else if (pre == s[i])cnt++;
		}
		res.push_back(s[len-1]);
		res.push_back(cnt + '0');
		s.clear();
		s = res;
	}
	cout << s;
	return 0;
}

接下来两道水题都是一次过的没啥好说

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
using namespace std;
unordered_map<string, int> str2int;
unordered_map<int, string> int2str;
int cnt = 1;
int getid(string s)
{
	if (str2int[s] == 0) {
		str2int[s] = cnt++;
	}
	int2str[str2int[s]] = s;
	return str2int[s];
}
unordered_map<int, double> schoolscore;
unordered_map<int, int>renshu;
struct resnode {
	string sname;
	int calscore, pnum;
	resnode(string ss, int aa, int bb) {
		sname = ss;
		calscore = aa;
		pnum = bb;
	}
};
vector<resnode> finres;
string trans(string s)
{
	for (int i = 0; i < s.length(); ++i)
	{
		if (s[i] >= 'A'&&s[i] <= 'Z')
		{
			s[i] = s[i] - 'A' + 'a';
		}
	}
	return s;
}
bool cmp(resnode a, resnode b)
{
	return a.calscore != b.calscore ? a.calscore > b.calscore:(a.pnum == b.pnum ? a.sname < b.sname : a.pnum < b.pnum);
}
int main()
{
	//freopen("test.txt", "r", stdin);
	int n;
	scanf("%d\n", &n);
	for (int i = 0; i < n; ++i)
	{
		char c;
		scanf("%c", &c);
		int id, score;
		string school;
		cin >> id >> score >> school;
		school = trans(school);
		scanf("\n");
		int schoolid = getid(school);
		double cal_score = (double)score;
		switch (c) {
		case 'B':
			cal_score /= 1.5;
			break;
		case 'T':
			cal_score *= 1.5;
			break;
		}
		schoolscore[schoolid] += cal_score;
		renshu[schoolid]++;
	}
	for (int i = 1; i < cnt; ++i)
	{
		string tmpname = int2str[i];
		int ren = renshu[i];
		int finscore = schoolscore[i];
		resnode tmp(tmpname, finscore, ren);
		finres.push_back(tmp);
	}
	sort(finres.begin(), finres.end(), cmp);
	printf("%d\n", cnt-1);
	int rank = 1;
	cout << rank << " " << finres[0].sname << " " << finres[0].calscore << " " << finres[0].pnum << endl;
	for (int i = 1; i < finres.size(); ++i)
	{
		if (finres[i].calscore < finres[i - 1].calscore)rank = i + 1;
		cout <<rank<<" "<< finres[i].sname << " " << finres[i].calscore << " " << finres[i].pnum << endl;
	}
	return 0;
}
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
using namespace std;
bool g[250][250];
bool isin[250];
int main()
{
	//freopen("test.txt", "r", stdin);
	memset(g, 0, sizeof(g));
	int nv, ne;
	scanf("%d%d", &nv, &ne);
	for (int i = 0; i < ne; ++i)
	{
		int s, e;
		scanf("%d%d", &s, &e);
		g[s][e] = g[e][s] = 1;
	}
	int q;
	scanf("%d", &q);
	while (q--)
	{
		memset(isin, 0, sizeof(isin));
		int num;
		scanf("%d", &num);
		int flag = 0;
		vector<int> cur;
		for (int i = 0; i < num; ++i)
		{
			int n;
			scanf("%d", &n);
			isin[n] = 1;
			cur.push_back(n);
		}
		for (int i = 0; i < num - 1; ++i)
		{
			for (int j = i + 1; j < num; ++j)
			{
				if (g[cur[i]][cur[j]] == 0)flag = 1;
				if (flag == 1)break;
			}
			if (flag == 1)break;
		}
		if (flag == 1) {
			printf("Not a Clique\n");
			continue;
		}
		else {
			int  flag2 = 0;
			for (int j = 1; j <= nv; ++j)
			{
				if (isin[j] == 0) {
					int i = 0, flag1 = 0;
					for (i; i < cur.size(); ++i) {
						if (g[cur[i]][j] == 0) {
							flag1 = 1;
							break;
						}
					}
					if (flag1 == 1 && i < cur.size())continue;
					else if (flag1 == 0 && i == cur.size()) {
						printf("Not Maximal\n");
						flag2 = 1;
						break;
					}
				}
			}
			if (flag2 == 0) {
				printf("Yes\n");
				continue;
			}
		}
	}
	return 0;
}

最后一题其实也没有什么好说的,就是普通的建树,然后lca我一开始是用了set,将其中一个的所有父节点都插入进去,然后将另一个的所有父节点比较,有相同的就说明找到了lca,就退出循环,这样得了21分,然后后来优化,我用了一个标记,两个节点同时向上遍历,具体的自己看代码

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<map>
#include<unordered_map>
#include<string.h>
#include<set>
using namespace std;
int pre[10010];
struct bstnode {
	bstnode* l = NULL, *r = NULL, *p = NULL;
	int val, tag=0;
};
void build(bstnode* &root, int l, int r, bstnode* p)
{
	if (root == NULL) root = new bstnode();
	int rval = pre[l];
	root->val = rval;
	root->p = p;
	int index = l + 1;
	while (index <= r && pre[index] < rval)index++;
	int llen = index - l - 1;
	int rlen = r - index + 1;
	if (llen > 0)build(root->l, l + 1, index - 1, root);
	if (rlen > 0)build(root->r, index, r, root);
}
bstnode* search(int val, bstnode* tree)
{
	/*if (tree == NULL)return NULL;
	else if (tree->val == val)return tree;
	else if (tree->val > val)return search(val, tree->l);
	else if (tree->val < val)return search(val, tree->r);*/
	bstnode* c = tree;
	while (c != NULL)
	{
		if (val == c->val)return c;
		else if (val < c->val)c = c->l;
		else c = c->r;
	}
	if (c == NULL)return NULL;
}
int main()
{
	//freopen("test.txt", "r", stdin);
	int q, n;
	scanf("%d%d", &q, &n);
	for (int i = 0; i < n; ++i)scanf("%d", &pre[i]);
	bstnode* root = NULL;
	build(root, 0, n - 1, NULL);
	while (q--)
	{
		int a, b;
		scanf("%d%d", &a, &b);
		bstnode* aaddr = search(a, root);
		bstnode* baddr = search(b, root);
		if (aaddr == NULL || baddr == NULL) {
			if (aaddr != NULL)printf("ERROR: %d is not found.\n", b);
			else if (baddr != NULL)printf("ERROR: %d is not found.\n", a);
			else printf("ERROR: %d and %d are not found.\n", a, b);
			continue;
		}
		//
		int flag = 0;
		bstnode* p = aaddr->p;
		while (p != NULL)
		{
			if (p == baddr) {
				flag = 1;
				printf("%d is an ancestor of %d.\n", b, a);
				break;
			}
			p = p->p;
		}
		if (flag == 1)continue;
		flag = 0;
		p = baddr->p;
		while (p != NULL)
		{
			if (p == aaddr) {
				flag = 1;
				printf("%d is an ancestor of %d.\n", a, b);
				break;
			}
			p = p->p;
		}
		if (flag == 1)continue;
		//

		bstnode* pa = aaddr->p, *pb = baddr->p;
		while (true)
		{
			if (pa != NULL)
			{
				if (pa->tag == 1) {
					printf("LCA of %d and %d is %d.\n", a, b, pa->val);
					break;
				}
				else {
					pa->tag = 1;
					pa = pa->p;
				}
			}
			if (pb != NULL)
			{
				if (pb->tag == 1) {
					printf("LCA of %d and %d is %d.\n", a, b, pb->val);
					break;
				}
				else {
					pb->tag = 1;
					pb = pb->p;
				}
			}
		}
		pa = aaddr->p, pb = baddr->p;
		while (pa!=NULL&&pa->tag == 1) {
			pa->tag = 0;
			pa = pa->p;
		}
		while (pb!=NULL&&pb->tag == 1) {
			pb->tag = 0;
			pb = pb->p;
		}
	}
	return 0;
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值