FatMouse's Speed 动规小练

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;
}
发布了130 篇原创文章 · 获赞 3 · 访问量 1616

猜你喜欢

转载自blog.csdn.net/yeyuluo/article/details/103915930