NBUT 1114 Alice's Puppets

来源:互联网 发布:钻石膏淘宝 编辑:程序博客网 时间:2024/05/13 11:18

题意: 爱丽丝能够控制木偶, 并且还能通过木偶控制其它木偶。如果木偶直接由爱丽丝控制, 则它的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 1010struct 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) {// initmemset(father, 0, sizeof(father));strcpy(father[0].name, "Alice");father[0].level = 0;// enterchar 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);}// sortsort(father + 1, father + 1 + n, cmp);// outputfor (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;}}}


原创粉丝点击