[关闭]
@PaulGuan 2016-10-17T13:25:29.000000Z 字数 882 阅读 664

L - Division into Teams 题解

算法 题解


题目大意

有n个人(2<=n<=500000),每个人都有一个能力值ai(1<=ai<40000),现在将这些人分为两队,一个组x个人,另一个组y个人。分队依据为:
x+y=n
|x-y|<=1
一个队的能力值pi和另一个队的能力值qi满足:

此处输入图片的描述

现在求一种分配方法。

分析

本题可以先将这些人的能力值进行排序,然后把第1,第n-1,第3,第n-3……个人分为一队,其他人分为另一队,需要注意的是,第一队的人的能力值的总和是相对较小的,如果n为奇数,需要将中间那个人分到第一队。

代码

  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. using namespace std;
  5. int n;
  6. struct boy
  7. {
  8. int ability;
  9. int index;
  10. };
  11. vector <boy> b;
  12. bool flag[100005]={false};
  13. int t1num=0;
  14. bool comp(boy x,boy y)
  15. {
  16. return x.ability<y.ability;
  17. }
  18. int main(void)
  19. {
  20. cin>>n;
  21. int i,j;
  22. for(i=0;i<n;i++)
  23. {
  24. boy l;
  25. cin>>l.ability;
  26. l.index=i+1;
  27. b.push_back(l);
  28. }
  29. sort(b.begin(),b.end(),comp);
  30. int num=n%2==0?n/2:n/2+1;
  31. for(i=0;i<num;i++)
  32. {
  33. if(i%2==0)
  34. j=i;
  35. else
  36. j=n-i-1;
  37. flag[b[j].index]=true;
  38. t1num++;
  39. }
  40. cout<<t1num<<endl;
  41. for(i=1;i<=n;i++)
  42. {
  43. if(flag[i])
  44. cout<<i;
  45. if(i!=n&&flag[i])
  46. cout<<" ";
  47. }
  48. cout<<endl;
  49. cout<<n-t1num<<endl;
  50. for(i=1;i<=n;i++)
  51. {
  52. if(!flag[i])
  53. cout<<i;
  54. if(i!=n&&!flag[i])
  55. cout<<" ";
  56. }
  57. cout<<endl;
  58. return 0;
  59. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注