1055. 集体照 (25)

待我称王封你为后i 2022-05-26 08:36 231阅读 0赞

拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下:

  • 每排人数为N/K(向下取整),多出来的人全部站在最后一排;
  • 后排所有人的个子都不比前排任何人矮;
  • 每排中最高者站中间(中间位置为m/2+1,其中m为该排人数,除法向下取整);
  • 每排其他人以中间人为轴,按身高非增序,先右后左交替入队站在中间人的两侧(例如5人身高为190、188、186、175、170,则队形为175、188、190、186、170。这里假设你面对拍照者,所以你的左边是中间人的右边);
  • 若多人身高相同,则按名字的字典序升序排列。这里保证无重名。

现给定一组拍照人,请编写程序输出他们的队形。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出两个正整数N(<=10000,总人数)和K(<=10,总排数)。随后N行,每行给出一个人的名字(不包含空格、长度不超过8个英文字母)和身高([30, 300]区间内的整数)。

输出格式:

输出拍照的队形。即K排人名,其间以空格分隔,行末不得有多余空格。注意:假设你面对拍照者,后排的人输出在上方,前排输出在下方。

输入样例:

  1. 10 3
  2. Tom 188
  3. Mike 170
  4. Eva 168
  5. Tim 160
  6. Joe 190
  7. Ann 168
  8. Bob 175
  9. Nick 186
  10. Amy 160
  11. John 159

输出样例:

  1. Bob Tom Joe Nick
  2. Ann Mike Eva
  3. Tim Amy John

代码:

  1. #include<stdio.h>
  2. #include<vector>
  3. #include<algorithm>
  4. #include<string.h>
  5. #include<string>
  6. using namespace std;
  7. vector<struct node> v;
  8. struct node
  9. {
  10. char name[10];
  11. int heigh;
  12. };
  13. bool cmp(struct node a,struct node b)
  14. {
  15. if(a.heigh!=b.heigh)
  16. return a.heigh>b.heigh;
  17. else
  18. return strcmp(a.name,b.name)<0;
  19. }
  20. int main()
  21. {
  22. int i,j,n,m,k,t,l=0,c;
  23. scanf("%d %d",&n,&m);
  24. for(i=0;i<n;i++)
  25. {
  26. struct node tmp;
  27. scanf("%s %d",tmp.name,&tmp.heigh);
  28. v.push_back(tmp);
  29. }
  30. sort(v.begin(),v.end(),cmp);
  31. if(n/m==0)
  32. {
  33. for(i=0;i<n;i++)
  34. {
  35. printf("%s\n",v[i].name);
  36. }
  37. return 0;
  38. }
  39. for(i=0;i<m;i++)
  40. {
  41. vector<struct node> ansv(n+1);
  42. if(i==0)
  43. {
  44. k=n/m+n%m;
  45. t=k/2+1;
  46. for(j=0;;j++)
  47. {
  48. if(j==0)
  49. {
  50. ansv[t]=v[l++];
  51. }
  52. else
  53. {
  54. if(t-j>=1)
  55. {
  56. ansv[t-j]=v[l++];
  57. }
  58. else
  59. {
  60. break;
  61. }
  62. if(t+j<=k)
  63. {
  64. ansv[t+j]=v[l++];
  65. }
  66. else
  67. {
  68. break;
  69. }
  70. }
  71. }
  72. for(j=1;j<=k;j++)
  73. {
  74. if(j==1)
  75. {
  76. printf("%s",ansv[j].name);
  77. }
  78. else
  79. {
  80. printf(" %s",ansv[j].name);
  81. }
  82. }
  83. printf("\n");
  84. }
  85. else
  86. {
  87. k=n/m;
  88. t=k/2+1;
  89. for(j=0;;j++)
  90. {
  91. if(j==0)
  92. {
  93. ansv[t]=v[l++];
  94. }
  95. else
  96. {
  97. if(t-j>=1)
  98. {
  99. ansv[t-j]=v[l++];
  100. }
  101. else
  102. {
  103. break;
  104. }
  105. if(t+j<=k)
  106. {
  107. ansv[t+j]=v[l++];
  108. }
  109. else
  110. {
  111. break;
  112. }
  113. }
  114. }
  115. for(j=1;j<=k;j++)
  116. {
  117. if(j==1)
  118. {
  119. printf("%s",ansv[j].name);
  120. }
  121. else
  122. {
  123. printf(" %s",ansv[j].name);
  124. }
  125. }
  126. printf("\n");
  127. }
  128. }
  129. return 0;
  130. }

发表评论

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

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

相关阅读

    相关 1055 集体(JAVA)

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 N/K(向下取整),多出来的人全部站在最后一排; 后排所有人的个子都不比

    相关 1055. 集体 (25)

    拍集体照时队形很重要,这里对给定的N个人K排的队形设计排队规则如下: 每排人数为N/K(向下取整),多出来的人全部站在最后一排; 后排所有人的个子都不比前排任何人

    相关 PAT-乙级-1055 集体

    拍集体照时队形很重要,这里对给定的 N 个人 K 排的队形设计排队规则如下: 每排人数为 /(向下取整),多出来的人全部站在最后一排; 后排所有人的个子都不比前排