只在uva online judge上过了,programming challenges没过。没想出是什么问题。
#include <iostream>
#include <sstream>
#include <fstream>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <assert.h>
#include <algorithm>
#include <math.h>
#include <ctime>
#include <functional>
#include <string.h>
#include <stdio.h>
#include <numeric>
#include <float.h>
using namespace std;
struct E {
int weight, iq, id;
E(int w, int i, int d) : weight(w), iq(i), id(d) {}
};
bool operator<(E &e1, E &e2) {
return e1.weight > e2.weight;
}
vector<E> es;
const int INT = 0x7fffffff;
int main() {
int w, iq, i = 0;
while (cin >> w >> iq) {
es.push_back(E(w, iq, ++i));
}
sort(es.begin(), es.end());
int n = es.size();
vector<int> position(n), pre(n);
for (int i = 0; i < n; i++) {
int ans = 1; pre[i] = i;
for (int j = i - 1; j >= 0; j--) {
if (es[i].weight < es[j].weight &&
es[i].iq > es[j].iq) {
if (ans < position[j] + 1) {
ans = position[j] + 1;
pre[i] = j;
}
}
}
position[i] = ans;
}
int select = 0;
for (int i = 1; i < n; i++) {
if (position[i] > position[select]) {
select = i;
}
}
cout << position[select] << endl;
do {
cout << es[select].id << endl;
if (pre[select] == select) break;
select = pre[select];
} while (true);
return 0;
}