SGU--199 beautiful people

墨蓝 2022-08-11 03:26 183阅读 0赞

题意:

一个土豪俱乐部里面的人勾心斗角,如果他们两个各有长处,则彼此不服气,如果一方完全弱于另一方则对其服服帖帖;给出你每个人的特征值,这里仅两个。S代表Strength,B代表beauty。俱乐部部长为了办一场和睦的晚会,也想邀请最多的成员,让你计算一下最多邀请多少人,并输出他们的序号。期中受邀请的两人必满足

s1<s2&&b1<b2。

解题:

看到这一题首先想到的应该就是最长上升子序列,可是这一题有两个关键字,应该怎么办呢?

当然把会员都按升序排列也行,这需要在判断的过程中判断两个条件,不过也可以吧第二个关键字按降序排列,因为第一个关键字不能相等。(其实在没参考别人的代码之前我用的是前者+_+)

本题要说考察的算法话就是O(n*logn)的最长上升子序列了,就是维护一个上升数组就行了;

而要注意的就是输出,按一个关键排列的输出根本不行(我二到按一个关键字的方式直接交了好几次,当然肯定wa)把排序后的编号存到数组中,并且存储前面的节点。

其实题目没要求,你按顺序输出,但是你也可以自定义个cmp,按编号为关键字sort一下,超不超时不敢保证,因为还要进行一系列操作,测试数据我不知道…..

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <cstdlib>
  4. #include <iostream>
  5. #include <algorithm>
  6. using namespace std;
  7. const int N = 100010;
  8. struct peo
  9. {
  10. int s,b,id;
  11. void read()
  12. {
  13. scanf("%d%d",&s,&b);
  14. }
  15. bool operator < (const peo &t)const
  16. {
  17. if(s==t.s)return b>t.b;
  18. else return s<t.s;
  19. }
  20. }mem[N];
  21. int id[N],prev[N];
  22. int main()
  23. {
  24. int i,len,n;
  25. scanf("%d",&n);
  26. for (i = 1;i <= n;i++)
  27. {
  28. mem[i].read();
  29. mem[i].id = i;
  30. }
  31. sort(mem + 1,mem + 1 + n);//n*log(n)最糟糕的将近a*1000W
  32. len = 1, id[1] = 1;
  33. for (i = 2;i <= n;i++)
  34. {
  35. if (mem[i].b > mem[id[len]].b)
  36. {
  37. len++;
  38. id[len] = i;
  39. prev[i] = id[len - 1];
  40. continue;
  41. }
  42. int low = 1,high = len;//节时,二分查找
  43. while (low < high)
  44. {
  45. int mid = (low + high) >> 1;
  46. if (mem[id[mid]].b < mem[i].b)
  47. {
  48. low= mid + 1;
  49. }else
  50. {
  51. high = mid;
  52. }
  53. }
  54. id[low] = i;
  55. prev[i] = id[low - 1];
  56. }
  57. printf("%d\n",len);
  58. for (i = id[len];i;i = prev[i])
  59. {
  60. printf("%d ",mem[i].id);
  61. }
  62. putchar(10);//printf("\n");
  63. return 0;
  64. }

发表评论

表情:
评论列表 (有 0 条评论,183人围观)

还没有评论,来说两句吧...

相关阅读

    相关 SGU--199 beautiful people

    题意: 一个土豪俱乐部里面的人勾心斗角,如果他们两个各有长处,则彼此不服气,如果一方完全弱于另一方则对其服服帖帖;给出你每个人的特征值,这里仅两个。S代表Strength,B

    相关 199. 余数之和

    [![知识共享许可协议][80x15.png]][80x15.png 1] 本作品采用[知识共享署名-相同方式共享 4.0 国际许可协议][80x15.png 1]进行许可

    相关 Beautiful Soup

    1. Beautiful Soup的简介 Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(pars...