zoukankan      html  css  js  c++  java
  • UVA 10131 Is Bigger Smarter?

    这道题开始想麻烦了,一直在思考体重相等的情况下,分成多个子序列,再分别对其IQ进行降序排列。这是太麻烦了。换个思路,体重只是IQ降序排列的一个限制,在求其最长下降子序列时只要考虑到体重相等时IQ不能相互嵌套就可以了,只是多了一个判断语句,真是会的不难,不会的真难啊,哈哈

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define MAXN 1000 + 10
    int w[MAXN],IQ[MAXN], r[MAXN], f[MAXN], road[MAXN];
    int n, flag, max;
    int cmp(const void *_p, const void *_q)
    {
    int *p = (int*)_p;
    int *q = (int*)_q;
    return w[*p] - w[*q];
    }
    void printmax()
    {
    max = -1;
    for(int i = 0; i < n ; i ++)
    if(f[i] > max) {max = f[i]; flag = i;}
    printf("%d\n",max);
    }
    void printroad(int i)
    {
    if(max --)
    {
    printroad(road[i]);
    printf("%d\n",r[i] + 1);
    }
    }
    void dp()
    {
    for(int i = 1; i < n; i ++)
    for(int j = 0; j < i; j ++)
    if(IQ[r[j]]>IQ[r[i]] && w[r[j]]!=w[r[i]] && f[i]<f[j]+1)
    {
    f[i] = f[j] + 1;
    road[i] = j;
    }
    }
    void solve()
    {
    for(int i = 0; i < n; i ++)
    { r[i] = i; f[i] = 1;}
    qsort(r, n, sizeof(r[0]), cmp);
    memset(road, -1, sizeof(road));
    dp();
    printmax();
    printroad(flag);
    }
    void input()
    {
    n = 0;
    while(scanf("%d%d",&w[n],&IQ[n]) == 2)
    n ++;
    solve();
    }
    int main()
    {
    input();
    return 0;
    }



  • 相关阅读:
    docker compose 笔记
    一个简单的计划
    译Node.js应用的持续部署
    Javascript中的字典和散列
    施耐德保护调试技巧
    施耐德Sepam 40系列备自投逻辑
    请随时告诉自己
    顺其自然
    启用
    我们能做的是......
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2395249.html
Copyright © 2011-2022 走看看