uva10131 Is Bigger Smarter?

本文介绍了一种解决特定问题的算法实现:通过构建有向无环图(DAG)来寻找最长路径。该问题涉及一系列的大象,每只大象都有其特定的体重和智商,目标是找出一个序列,在这个序列中每只大象的体重严格递增且智商严格递减,同时该序列尽可能长。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一开始以为是LIS,再后来想到其实是DAG最长路,每一个大象都看成是一个节点,大象a和b,如果a的体重小于b,而iq大于b,则节点a到节点b有一条路径长度为1的路,只要找最长路就行了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn=1001;
const int inf=1000000;
int g[maxn][maxn],d[maxn],next[maxn];
typedef struct elephant
{
    int num,weight,iq;
}enode;
bool cmp(enode x,enode y)
{
    if(x.weight!=y.weight) return x.weight<y.weight;
    if(x.iq!=y.iq) return x.iq>y.iq;
    return x.num<y.num;
}
enode node[maxn];
int main()
{
//    freopen("in.txt","r",stdin);
    int n=1;
    while(scanf("%d%d",&node[n].weight,&node[n].iq)!=EOF)
    {
        node[n].num=n;//记录没有排序前的真实大象序列号
        n++;
    }
    n--;
    sort(node+1,node+n+1,cmp);//按体重递增,iq递减排序
    memset(g,0,sizeof(g));
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
            if((node[i].weight<node[j].weight)&&(node[i].iq>node[j].iq))
                            g[i][j]=1;
    for(int i=1;i<=n;i++)
        d[i]=1;//一个大象本身自己的长度为1
    memset(next,-1,sizeof(next));
    for(int i=n;i>=1;i--)
        for(int j=i+1;j<=n;j++)
            if(g[i][j])
            {
                if(d[i]<d[j]+1)
                {
                    d[i]=d[j]+1;
                    next[i]=j;//记录大象i的下一个节点j,方便后面打印路径
                }
            }
        int maxnum=0,pos=-1;
    for(int i=1;i<=n;i++)
        if(d[i]>maxnum)
        {
            pos=i;
            maxnum=d[i];
        }
    printf("%d\n",maxnum);
    for(int i=pos;i!=-1;i=next[i])
    {
        printf("%d\n",node[i].num);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值