题目大意:
给你好多只老鼠的重量,行走速度,要求选出多只老鼠,使得重量增大时速度变小,问最多有多少只这样的老鼠,给出其中的一个排列。
题目分析:
有点像上升子列的意思但是有两个维度,我们可以按照质量排序之后,求一次速度最长上升子列然后输出就可以了。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 10000 + 5;
struct mouse
{
int w, v, id;
mouse(int w = 0, int v = 0, int id = 0) : w(w), v(v), id(id) {}
} m[maxn];
bool cmp(const mouse &lhs, const mouse &rhs)
{
if(lhs.w != rhs.w)
return lhs.w < rhs.w;
return lhs.v > rhs.v;
}
int dp[maxn], pre[maxn];
int main()
{
int cnt = 1;
while(~scanf("%d%d", &m[cnt].w, &m[cnt].v))
m[cnt].id = cnt, cnt++;
sort(m + 1, m + cnt, cmp);
reverse(m + 1, m + cnt);
for(int i = 0; i <= cnt; i++)
dp[i] = 1;
memset(pre, -1, sizeof(pre));
int t = -1, p = -1;
for(int i = 1; i < cnt; i++)
{
for(int j = 1; j < i; j++)
{
if(m[j].w != m[i].w && m[j].v < m[i].v && dp[i] < dp[j] + 1)
{
dp[i] = dp[j] + 1;
pre[i] = j;
if(p < dp[i])
{
p = dp[i];
t = i;
}
}
}
}
printf("%d\n", p);
while(t != -1)
{
printf("%d\n", m[t].id);
t = pre[t];
}
return 0;
}