FatMouse’s Speed
原题链接https://vjudge.net/contest/349774#problem/G
题目要求找出对于体重增大速度减小这一条件的最多小鼠
对于此条件进行排序
然后由链长来反推出每个数据的位置,根据题目同长度有很多情况,只需要输出一种即可
当然 学了并查集之后也可以用pre来记录,查找父节点来输出
说实话我感觉我这种方法有问题,但是不管是bfs最后一题还是这一题都莫名其妙a掉了,个人觉得最好还是采用pre来记录一下。
本题为多组输入输入数据,调试代码时可以使用 ctrl+z来跳出
输入数据
换行 ctrl+z
再次回车即可输出
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<fstream>
#include<queue>
using namespace std;
struct node
{
long long w;
long long s;
long long num;
}stu[10005];
long long dp[10005];
bool cmp(node x,node y)
{
if(x.w==y.w)
{
return x.s>y.s;
}
return x.w<y.w;
}
int main()
{
long long n=1,x,y;
while(~scanf("%lld %lld",&x,&y))
{
stu[n].w=x;
stu[n].s=y;
stu[n].num=n;
n++;
}
long long i;
sort(stu+1,stu+n+1,cmp);//根据题目条件排序
long long j,sum=0;
for(i=n;i>=1;i--)
{
dp[i]=1;
for(j=i;j<=n;j++)
{
if(stu[j].w>stu[i].w&&stu[j].s<stu[i].s)//判断增加长度的条件
{
dp[i]=max(dp[i],dp[j]+1);
}
}
sum=max(sum,dp[i]);
}
printf("%lld\n",sum);
for(i=1;i<=n;i++)
{
if(dp[i]==sum)
{
printf("%lld\n",stu[i].num);
sum--;
}
if(sum==0)
{
break;
}
}
return 0;
}
另外附上使用pre记录输出
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<fstream>
#include<queue>
using namespace std;
struct node
{
long long w;
long long s;
long long num;
} stu[10005];
long long pre[10005];
long long dp[10005];
long long ans[10005];
bool cmp(node x,node y)
{
if(x.w==y.w)
{
return x.s>y.s;
}
return x.w<y.w;
}
int main()
{
long long n=1,x,y;
while(~scanf("%lld %lld",&x,&y))
{
stu[n].w=x;
stu[n].s=y;
stu[n].num=n;
n++;
}
long long i;
sort(stu+1,stu+n+1,cmp);
long long j,sum=0,maxx=0;
for(i=1; i<=n; i++)
{
dp[i]=1;
for(j=1; j<i; j++)
{
if(stu[j].w<stu[i].w&&stu[j].s>stu[i].s)
{
if(dp[i]<dp[j]+1)
{
dp[i]=dp[j]+1;
pre[i]=j;//储存节点
}
}
}
if(sum<dp[i])
{
maxx=i;
sum=dp[i];
}
}
// for(i=0; i<=n; i++)
// {
// printf("%lld ",dp[i]);
// }
// cout<<endl;
// for(i=0; i<=n; i++)
// {
// printf("*%lld %lld\n",pre[i],stu[i].num);
// }
// cout<<endl;
printf("%lld\n",sum);
int sum1=0;
while(maxx!=0)//读取节点
{
ans[sum1++] = maxx;
maxx = pre[maxx];
}
if(sum==1)
{
printf("%lld\n",dp[0]);
}
while(sum1>0)//输出
{
sum1--;
printf("%lld\n",stu[ans[sum1]].num);
}
return 0;
}