All for PAT秋考 | 可能是2016.9甲级

😉14 : 20 — 16 : 58 第一次两个半小时100/100。
第三题真的挺难受的。难受的感觉现在都没完全消失。。。。。。(噗嗤 看了大佬的题解 发现是我写麻烦了的锅


20 25 25 30

1112 Stucked Keyboard (20 分)

  • 若某字符连续出现的次数x中,存在x%repeat_times不为0的,则可判定该字符按键无故障。
  • 某字符状态设为无故障之后,状态就保持无故障。(不能再设为有故障)
  • 最后一个字符的处理⚠️
  • 按检测到故障的顺序输出
#include <iostream>
#include <string>
#include <cctype>
#include <vector>

using namespace std;

int char2index(char ch) {
    if (isdigit(ch)) return ch - '0';
    if (islower(ch)) return ch - 'a' + 10;
    return 36; // _
}

int main() {
    int hash[37] = {0}; // 0-9 0-9  a-z 10-35  _ 36
    // 0 not exist    1 not stucked    -1 stucked
    string str0;
    int ktimes;
    cin >> ktimes >> str0;
    int size = str0.size();
    vector<char> qaq;
    char curr = str0[0];
    int cnt = 1;
    for (int i = 1; i < size; ++i) {
        if (str0[i] != curr) {
            int index = char2index(curr);
            if (cnt % ktimes) {
                hash[index] = 1;
            } else if (hash[index] != 1 && hash[index] != -1) {
                hash[index] = -1;
                qaq.emplace_back(curr);
            }
            curr = str0[i];
            cnt = 1;
        } else {
            cnt++;
        }
    }
    int last_index = char2index(curr);
    if (cnt % ktimes) {
        hash[last_index] = 1;
    } else if (hash[last_index] != 1 && hash[last_index] != -1) {
        hash[last_index] = -1;
        qaq.emplace_back(curr);
    }
    for (auto item : qaq) {
        if (hash[char2index(item)] == -1) {
            printf("%c", item);
        }
    }
    printf("\n");
    for (int i = 0; i < size;) {
        printf("%c", str0[i]);
        if (hash[char2index(str0[i])] == -1) {
            i += ktimes;
        } else i++;
    }
    return 0;
}

1113 Integer Set Partition (25 分)

  • 水题,n为偶数、奇数分开写。奇数时注意。
#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;
int nn, nums[100010], sum = 0;

int main() {
    scanf("%d", &nn);
    for (int i = 0; i < nn; ++i) {
        scanf("%d", &nums[i]);
        sum += nums[i];
    }
    sort(nums, nums + nn);
    int temp = 0;
    for (int i = 0; i < nn / 2; i++) {
        temp += nums[i];
    }
    if (nn % 2) {
        int mid = nums[nn / 2];
        printf("1 %d\n", max(abs(sum - temp - temp), abs(sum - 2 * temp - 2 * mid)));
    } else {
        printf("0 %d\n", abs(sum - temp - temp));
    }
    return 0;
}

1114 Family Property (25 分)

并查集,加了不少花样。
首先是若不将id和index作映射,在_union操作结束后,可能需要一个bool valid[i]来区分下标(id)为i的人是否出现过。。。。。。emmmm我写的有点麻烦了,实际上并不要求维护每个family的成员列表。
还是学习一下liuchuo大佬的思路吧。只要在_union(a,b)时,确保_find(a)、_find(b)中较大的组合并到较小的组,就能省很多事了。。。。。。

  • 来自 —日沉云起@csdn
  • liuchuo大佬的题解
    用并查集。分别用两个结构体数组,一个data用来接收数据,接收的时候顺便实现了并查集的操作union,另一个数组ans用来输出最后的答案,因为要计算家庭人数,所以用visit标记所有出现过的结点,对于每个结点的父结点,people++统计人数。标记flag == true,计算true的个数cnt就可以知道一共有多少个家庭。排序后输出前cnt个就是所求答案~~

    • 喵喵喵???输入的时候我在sstream什么呢。。。明明直接读数字就好啊。。。。。
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <string>
#include <sstream>
#include <set>
#include <map>
#include <vector>

using namespace std;

struct Rec {
    int m_estate = 0, area = 0;
} people[10001]; // index  =  id

struct Kazoku {
    int min_id;
    unsigned long n_member;
    int total_estate;
    double average_area;

    bool operator<(const Kazoku &k2) const {
        if (average_area != k2.average_area)
            return average_area > k2.average_area;
        return min_id < k2.min_id;
    }
};

map<int, int> id_index;
map<int, int> index_id;
int uf[10001], cntNO = 0;

int _find(int a) {
    return uf[a] < 0 ? a : uf[a] = _find(uf[a]);
}

int get_index(int id) {
    if (id == -1) return -1;
    if (id_index.find(id) == id_index.end()) {
        id_index[id] = cntNO;
        index_id[cntNO] = id;
        cntNO++;
    }
    return id_index[id];
}

void _union(int a, int b) {
    if (b == -1) return;
    a = _find(a);
    b = _find(b);
    if (a != b) {
        uf[a] += uf[b];
        uf[b] = a;
    }
}

map<int, set<int>> lead_members;
map<int, pair<int, int>> lead_id_total;

int main() {
    fill(uf, uf + 10001, -1);
    stringstream ss;
    int nn;
    scanf("%d", &nn);
    for (int i = 0; i < nn; ++i) {
        int id, fid, mid, cid, m_estate, area;
        string father, mother;
        cin >> id >> father >> mother;
        int index = get_index(id);
        ss.clear();
        ss << father;
        ss >> fid;
        fid = get_index(fid);
        _union(index, fid);
        ss.clear();
        ss << mother;
        ss >> mid;
        mid = get_index(mid);
        _union(index, mid);
        int nchild;
        scanf("%d", &nchild);
        for (int j = 0; j < nchild; ++j) {
            scanf("%d", &cid);
            cid = get_index(cid);
            _union(index, cid);
        }
        scanf("%d%d", &m_estate, &area);
        people[id].m_estate = m_estate, people[id].area = area;
    }
    for (int i = 0; i < cntNO; ++i) {
        _find(i);
    }
    for (int i = 0; i < cntNO; ++i) {
        int lead_id = index_id[_find(i)], me_id = index_id[i];
        lead_members[lead_id].insert(me_id);
        lead_id_total[lead_id].first += people[me_id].m_estate;
        lead_id_total[lead_id].second += people[me_id].area;
    }
    set<Kazoku> res;
    for (auto &item:lead_members) {
        int lead_id = item.first;
        res.insert(Kazoku{*(item.second.begin()), item.second.size(),
                          lead_id_total[lead_id].first,
                          lead_id_total[lead_id].second * 1.0 / item.second.size()});
    }
    printf("%lu\n", res.size());
    for (auto item : res) {
        printf("%04d %lu %.3lf %.3lf\n", item.min_id, item.n_member,
               item.total_estate * 1.0 / item.n_member, item.average_area);
    }
    return 0;
}

1115 Counting Nodes in a BST (30 分)

插入结点,采用递归写法。insert函数传参数要传Node *&!!!
建树(插入结点)时,顺便得到插入点所在深度、计数各层结点数,给insertNode加一个depth参数就好。

#include <cstdio>
#include <algorithm>

using namespace std;
int data, nn, depth_cnt[1010] = {0}, max_depth = -1;
struct Node {
    int key;
    Node *lchild = NULL, *rchild = NULL;
};

void insertNode(Node *&root, int x, int depth) {
    if (root == NULL) {
        root = new Node;
        root->key = x;
        depth_cnt[depth]++;
        max_depth = max(max_depth, depth);
        return;
    }
    if (x <= root->key) insertNode(root->lchild, x, depth + 1);
    else insertNode(root->rchild, x, depth + 1);
}

int main() {
    Node *root = NULL;
    scanf("%d", &nn);
    for (int i = 0; i < nn; ++i) {
        scanf("%d", &data);
        insertNode(root, data, 0);
    }
    printf("%d + %d = %d\n", depth_cnt[max_depth], depth_cnt[max_depth - 1],
           depth_cnt[max_depth] + depth_cnt[max_depth - 1]);
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,042评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,996评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,674评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,340评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,404评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,749评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,902评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,662评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,110评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,577评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,258评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,848评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,726评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,952评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,271评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,452评论 2 348

推荐阅读更多精彩内容