1265 - C. Beautiful Regional Contest (贪心)

忘是亡心i 2021-07-17 00:35 441阅读 0赞

题目

思路:要求每个金牌切的题高于银牌,银牌高于铜牌,铜牌高于铁牌,那么必然对于切题一样的队伍只会获得相同的牌。此时我们把切题一样的队看作一个个打包好了的队伍堆,给牌必须一堆一堆的给。且要求金牌一定小于铜牌和银牌,最后要使给出的牌子最多,且给的牌子<=总数/2,每个牌子>0。那么先贪心一下,让金牌只取一个切题最高的堆(留下更多的堆,为了满足每种牌子都有的给,且有多余的堆就给铜和银,不会造成牌子浪费),然后再给银牌取到正好大于金牌,剩下的还能给牌子且使牌子总数<=n/2全给铜牌,如果最终答案银牌或铜牌少于金则不存在,细节见代码。

Code:

  1. #include<iostream>
  2. #include<string>
  3. #include<map>
  4. #include<algorithm>
  5. #include<memory.h>
  6. #include<cmath>
  7. #define pii pair<int,int>
  8. #define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
  9. using namespace std;
  10. typedef long long ll;
  11. const int Max = 2e6 + 5;
  12. int lst[Max];
  13. int main()
  14. {
  15. int t;cin >> t;
  16. while (t--)
  17. {
  18. int n;cin >> n;
  19. map<int, int,greater<int>> ma;
  20. for (int i = 1;i <= n;i++)
  21. {
  22. cin >> lst[i];ma[lst[i]]++;
  23. }
  24. int s1 = ma[lst[1]], s2 = 0, s3 = 0;
  25. for (auto i = ma.begin();i != ma.end();i++)
  26. {
  27. if (ma.size() <= 3)break;
  28. if (i == ma.begin())i++;
  29. if(s2<=s1)s2 += i->second;
  30. else
  31. {
  32. if (s1+s2+s3 + i->second>n/2)break;
  33. s3 += i->second;
  34. }
  35. }
  36. if (s2 <= s1 || s3 <= s1)cout << "0 0 0" << endl;
  37. else cout << s1 << " " << s2 << " " << s3 << endl;
  38. }
  39. }

发表评论

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

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

相关阅读