NBUT 1114 Alice's Puppets

题意: 爱丽丝能够控制木偶, 并且还能通过木偶控制其它木偶。如果木偶直接由爱丽丝控制, 则它的level = 1, 如果木偶是由爱丽丝直接控制的木偶所控制的 则它的level =2, 以此类推。 输入的一行 前一个名字表示被控制的木偶, 后一个名字表示控制者。 控制者一定会在被控制者之前出现。  输出所有的木偶 以及木偶的level, 按level从小到大排序, 若level一样, 则按字典序排序。


思路:既然控制者一定会先出现, 那么我们只用一个一位数组father[] 来保存所有木偶 father[0] 为爱丽丝, 当第i个木偶出现的时候,从1到i-1扫描数组的木偶, 找到它的控制者的level, 然后它的level就在此基础上+1, 最后把这个木偶存在father[i]。


算法复杂度:总共要扫描 1 + 2 +3......+ (n-1) + n. 即n(n + 1)/ 2. 故复杂度为 o(n^2)


代码:

今天在比赛的时候自己写sort()的辅助函数。 感觉突然很简洁的实现了  当level一样时, 按字典序排。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

#define MAX_LEN 25
#define MAX_N 1010

struct SPuppet
{
	char name[MAX_LEN];
	int level;
};

int getFatherLvl(char *);
int cmp(const SPuppet &, const SPuppet &);
int n;

SPuppet father[MAX_N];

int main()
{
	while (scanf("%d", &n) == 1) {
		// init
		memset(father, 0, sizeof(father));
		strcpy(father[0].name, "Alice");
		father[0].level = 0;

		// enter
		char pupName[MAX_LEN], fatherName[MAX_LEN];
		for (int i = 1; i <= n; i++) {
			scanf("%s %s", pupName, fatherName);
			father[i].level = getFatherLvl(fatherName) + 1;
			strcpy(father[i].name, pupName);
		}

		// sort
		sort(father + 1, father + 1 + n, cmp);
		
		// output
		for (int i = 1; i <= n; i++) {
			printf("%s %d\n", father[i].name, father[i].level);
		}

		// end a case
	}

	return 0;
}

int getFatherLvl(char *name)
{
	for (int i = 0; i < n; i++) {
		if (strcmp(father[i].name, name) == 0) {
			return father[i].level;
		}
	}
}

int cmp(const SPuppet &a, const SPuppet &b)
{
	if (a.level != b.level) {
		return a.level < b.level;
	} else {
		int rslt = strcmp(a.name, b.name);

		if (rslt < 0) {
			return true;
		} else {
			return false;
		}
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值