hdu 1160 FatMouse's Speed

寻找最慢肥鼠的算法
本文介绍了一种算法,该算法通过先对老鼠的质量和速度进行特定排序,然后使用最长单调递增子序列算法来找出一个最大的子集,使得子集中的老鼠满足越肥跑得越慢的条件。
已知一组老鼠的质量和速度,找出一个最大的子集满足越肥的老鼠跑的越慢。先对老鼠的质量进行从小到大排序,质量相同的情况下对速度进行从大到小排序。然后对速度运行最长单调递增子序列算法。递归输出结果。



#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
struct node{
int m;
int s;
int num;
}mouse[1010];
int x,y,n,pos;
int path[1010],sum[1010];
bool cmp(node a,node b)
{
   if(a.m==b.m)
     return a.s>b.s;
   return a.m<b.m;
}
void output(int path[],int pos)
{
   if(pos==0)  return;
   else output(path,path[pos]);
   printf("%d\n",mouse[pos].num);
}
int main()
{
     n=0;
     memset(path,0,sizeof(path));
     memset(sum,0,sizeof(sum));
     while(scanf("%d%d",&x,&y)!=EOF)
     {
       mouse[++n].m=x;
       mouse[n].s=y;
       mouse[n].num=n;
     }
     sort(mouse+1,mouse+n+1,cmp);
     sum[1]=1;
     for(int i=2;i<=n;i++)
     {
        for(int j=1;j<i;j++)
          if(mouse[i].s<mouse[j].s&&mouse[i].m>mouse[j].m)
          {
            if(sum[i]<sum[j])
            {
              sum[i]=sum[j];
              path[i]=j;
            }
          }
        sum[i]++;
     }
     int max=0;
     for(int i=1;i<=n;i++)
     {
        if(sum[i]>max)
        {
           max=sum[i];
           pos=i;
        }
     }
     printf("%d\n",max);
     output(path,pos);
     return 0;
}
     
     

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值