HDU 6040 Hints of sd0061 思维

叁歲伎倆 2022-01-05 02:28 227阅读 0赞

  题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=6040

  题目大意: 给定数组a, b。要求输出和B长度相同的数组C, C[i]为在A中排名为B[i]的数, 重新排A数组, 使得a[i]必须是a数组中第b[i]+1大的数

  解题思路: 首先我们要把数组A求出来。第一想法就是最单纯的将A排个序, 然后输出A[B[i]], 自己还恬不知耻的去交了一发, 要是这都不会T, 还叫啥ACM啊……

        好吧, 我题意理解错了……自己太浮躁了, 检讨一下自己。 有时候数据会给的非常极端来误导你…….记住了 …. 以后不要这样了。先将B数组排序, 这里用到了一个快排的思想, 库函数为nth_element(a, a+k, a+n), 将第K大的元素放在数组的下标K上, 左面全比他小, 右面全比他大, 也就是说如果k是由大到小的话可以省去一半左右的时间, 这题也是卡这个的, 还有一个问题就是可能会出现n < m 的情况, 这时候为了加快速度可以通过b[pos[i]] == b[pos[i+1]]来提前判定。

  代码:

ContractedBlock.gif ExpandedBlockStart.gif

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include<math.h>
  5. #include<iostream>
  6. #include<algorithm>
  7. #include<stack>
  8. #include<queue>
  9. #include<vector>
  10. #include<set>
  11. #include<map>
  12. #include<string>
  13. using namespace std;
  14. typedef long long ll;
  15. unsigned int a[10000010];
  16. unsigned int x,y,z;
  17. unsigned int rng61()
  18. {
  19. unsigned int t;
  20. x ^= x << 16;
  21. x ^= x >> 5;
  22. x ^= x << 1;
  23. t = x;
  24. x = y;
  25. y = z;
  26. z = t ^ x ^ y;
  27. return z;
  28. }
  29. int b[105];
  30. int n,m,pos[105];
  31. unsigned int ans[105];
  32. bool cmp(int x,int y)
  33. {
  34. return b[x]<b[y];
  35. }
  36. int main()
  37. {
  38. int v=1;
  39. while(scanf("%d%d%u%u%u",&n,&m,&x,&y,&z)!=EOF)
  40. {
  41. for(int i=0;i<m;i++)
  42. {
  43. scanf("%d",&b[i]);
  44. pos[i]=i;
  45. }
  46. sort(pos,pos+m,cmp);//通过b的大小对下标排序。
  47. for(int i=0;i<n;i++)
  48. {
  49. a[i]=rng61();
  50. }
  51. b[pos[m]=m]=n;
  52. for(int i=m-1;i>=0;i--)
  53. {
  54. if(b[pos[i]]==b[pos[i+1]])
  55. {
  56. ans[pos[i]]=ans[pos[i+1]];
  57. continue;
  58. }
  59. nth_element(a,a+b[pos[i]],a+b[pos[i+1]]);
  60. ans[pos[i]]=a[b[pos[i]]];
  61. }
  62. printf("Case #%d:",v++);
  63. for(int i=0;i<m;i++)
  64. {
  65. printf(" %u",ans[i]);
  66. }
  67. printf("\n");
  68. }
  69. return 0;
  70. }

  思考: 我学到了一个小小的skill, 如果对一个数组进行排序如果还想保留下标的信息的话, 不妨再创建一个下标数组, 然后写好cmp函数, 这时候排序的仅仅是下标, 不仅达到了目的, 还保留了原数组, 很巧妙, 这是一道很费脑筋的题, 只有多练才能在正式的比赛上想到这种方法吧

转载于:https://www.cnblogs.com/FriskyPuppy/p/7255799.html

发表评论

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

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

相关阅读

    相关 HDU 6370(思维)

    [传送门][Link 1] 思路:因为狼说什么都是可以的,所以全是狼是可以,村民为0。 那问题就是转化成求铁狼的数量。我们对村民边建图,我们发现,一个连通分量要么是个基环树