https://vjudge.net/contest/430905#problem/C
给出猫的体重和对应的速度,要求是得到一个体重上升的子序列的同时,速度必须是严格下降的序列。
请输出最长的这样的子序列,并且输出这些猫的原本的序号。
我们需要一个结构体来记录猫的体重,速度和序号。按照速度下降来排序,最后转化成了求体重的最长上升子序列。
这答案多种,取任意一个即可。
#include<iostream>
#include<algorithm>
using namespace std;
struct mouse
{
int a,b,c;
} m[1005];
bool cmp(mouse x,mouse y)
{
if(x.b!=y.b) return x.b>y.b;
else return x.a<y.a;
}
int main()
{
int n=0;
int x,y;
while(cin >> x>>y)
{
n++;
m[n].a=x;
m[n].b=y;
m[n].c=n;
}
sort(m+1,m+1+n,cmp);
int d[1005]={0},maxx=0,rr[1005];
for(int i=2; i<=n; i++)//这是最长上升子序列的套路
{
for(int j=i-1; j>=1; j--)
{
if(m[i].a>m[j].a&&m[i].b<m[j].b)
//限制体重的同时,别忘了速度是严格下降的
{
d[i]=max(d[j]+1,d[i]);//状态转移方程,用d标记了当前体重的最大长度
maxx=max(d[i],maxx);//一直更新子序列的最大长度
}
}
}
cout << maxx+1 << endl;
int r=maxx,minn=100000;
x=0;
for(int i=n;i>=1,r>=0;i--)
//这一步必须反向遍历,后面的大的值一定是由前面小值得到的,而前面小值的后面不一定有大值
//这里的大是指子序列长度
{
if(d[i]==r&&m[i].a<minn)
{
rr[r]=m[i].c;//标记序号
minn=m[i].a;//更新当前长度最大值的体重的最大值
r--;
}
}
for(int i=0;i<=maxx;i++)
{
cout << rr[i]<< endl;
}
return 0;
}
一、图状结构数据广泛存在 字节跳动的所有产品的大部分业务数据,几乎都可以归入...
UDP # 前序 UDP用户数据报协议没有连接的是面向数据报的是不可靠 # 套接字 就是 ...
本文实例为大家分享了javascript实现简单页面倒计时的具体代码,供大家参考,具...
文章目录 一、错误描述 二、解决 一、错误描述 今天在使用QuartusII画计组课设的...
一直在做php的开发工作.在开发的过程中老早就听说了“伪静态”这一说。但是一直...
fileup.htm html head title 千花飞舞之上传单个文件 /title /head body form en...
最简单的删除弹窗小广告的方式 都2021年了你是否在为电脑满是弹窗小广告而发愁呢...
一、Flutter 的声明式视图开发 在原生系统(Android、iOS)或原生JavaScript 开发...
1.简要描述 腾讯短网址(url.cn短链接)生成api接口是腾讯官方对外公开的短网址...
AJAX +JSON=》JSP AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部...