1. 程式人生 > >PAT L2-012. 關於堆的判斷【資料結構】

PAT L2-012. 關於堆的判斷【資料結構】

題目連結

思路

題目本身不難,就是字串處理有點繁瑣。
但是有個巨坑!就是你必須得邊push邊造堆,不能一次性讀完再造堆,兩者造出來的順序是不一樣的!為此改了十多遍(累覺不愛)
這裡用了STL的make_heap,自己手寫也可以,不怎麼長。

AC程式碼

#include <iostream>
#include <queue>
#include <vector>
#include <sstream>
#include <algorithm>
#include <cstdio>
#include <functional>
using namespace std; vector<int>heap; int find(int a) { return distance(heap.begin(), find(heap.begin(), heap.end(), a)); } int main() { int n, m; scanf("%d%d", &n, &m); while (n--) { int t; scanf("%d", &t); heap.push_back(t); make_heap(heap.begin(), heap.end(), greater<int
>()); } getchar(); while (m--) { string q; getline(cin, q); if (q[q.length() - 1] == 't') { int a; stringstream ss(q); ss >> a; if (heap[0] == a) printf("T\n"); else printf("F\n"); } else
if (q[q.length() - 1] == 's') { int a, b; string temp; stringstream ss(q); ss >> a >> temp >> b; int pos_a = find(a); int pos_b = find(b); pos_a++; pos_b++; if (pos_a / 2 == pos_b / 2) { printf("T\n"); } else { printf("F\n"); } } else { stringstream ss(q); int a, b; string temp; ss >> a >> temp >> temp; if (temp[0] == 't') { ss >> temp >> temp >> b; int pos_a = find(a); int pos_b = find(b); if (pos_b == pos_a * 2 + 1 || pos_b == pos_a * 2 + 2) { printf("T\n"); } else { printf("F\n"); } } else if (temp[0] == 'a') { ss >> temp >> temp >> b; int pos_a = find(a); int pos_b = find(b); if (pos_a == pos_b * 2 + 1 || pos_a == pos_b * 2 + 2) { printf("T\n"); } else { printf("F\n"); } } } } return 0; }