你的手機上有通話紀錄,格式為
MM:DD:hh:mm phone-number +/-
其中 + 為重要的訊息,- 為不重要的訊息
並且訊息的年份能夠從訊息的時間推得(嚴格遞增為一年)
我們要在可以推的所有重要訊息年份的前提下,選擇刪掉最多的不重要訊息
並且在最後輸出留下來的訊息數
(最下面一條是最近的訊息)
#include <iostream>
using namespace std;
int main() {
int n;
while (cin >> n && n != 0) {
int timestamp[n];
bool isImportant[n];
int year[n];
for (int i = 0; i < n; i++) {
int month, day, hour, minute;
char mark;
scanf("%d:%d:%d:%d %*s %c", &month, &day, &hour, &minute, &mark);
timestamp[i] = ((((month * 31) + day) * 24) + hour) * 60 + minute;
isImportant[i] = mark == '+';
}
year[0] = 0;
int current_year;
for (int i = 1; i < n; i++) {
if (timestamp[i] <= timestamp[i - 1]) {
year[i] = year[i - 1] + 1;
} else {
year[i] = year[i - 1];
}
current_year = year[i];
}
int dp[n], last = -1, first_important = -1;
for (int i = n - 1; i >= 0; i--) {
if (last == -1 && year[i] == current_year) {
dp[i] = 1;
} else {
dp[i] = n - i;
}
if (last == -1 && (isImportant[i] || year[i] != current_year)) {
last = i;
}
if (isImportant[i]) {
first_important = i;
}
}
for (int i = last; i >= first_important; i--) {
for (int j = i + 1; j < n; j++) {
if (year[i] == year[j] || (timestamp[i] >= timestamp[j] && year[j] - year[i] == 1)) {
dp[i] = min(dp[i], dp[j] + 1);
} else {
break;
}
if (isImportant[j]) {
break;
}
}
}
cout << dp[first_important] << endl;
}
return 0;
}