A:最多肯定只需要兩步,中間的兩行,一行黑,一行白就可以了,這樣的話,只需要考慮一開始就滿足,和枚舉一行去染色滿足的情況就可以了,暴力即可
B:貪心,一個記錄當前有貓的位置和當前超過一只貓的位置,然後位置排序從左往右找,如果當前能移動到之前超過兩只的位置,就全部移動過去,不增加,如果不行,那麼考慮當前這個能不能鋪成一條,如果可以,相應更新位置,如果不行,就讓貓全部堆到右邊右邊去,然後堆數多1
代碼:
A:
#include#include #include #include #include
#include#include using namespace std; typedef pair pii; #define MP(a,b) make_pair(a,b) const int INF = 0x3f3f3f3f; class CatsOnTheLineDiv1 { vector g; public: int getNumber(vector position, vector count, int time) { int n = position.size(); for (int i = 0; i < n; i++) g.push_back(MP(position[i] - time, count[i])); sort(g.begin(), g.end()); int le = -INF, sink = -INF, ans = 0; for (int i = 0; i < n; i++) { int l = g[i].first; int r = l + 2 * time; if (l <= sink) continue; le = max(le, l); if (r - l + 1 < count[i]) { ans++; sink = r; } else { le += count[i]; } } return ans; } };