第十二章 贪心 6 AcWing 1618. 结绳

逃离我推掉我的手 2024-03-31 13:51 165阅读 0赞

第十二章 贪心 6 AcWing 1618. 结绳

原题链接

AcWing 1618. 结绳

算法标签

贪心 哈夫曼树

思路

在这里插入图片描述
为使结果尽可能大, 长度小的应该位于底层(长度较小的损失较大,长度较大的损失较小)
证明
反证法
假设若存在长度小的位于非底层, 长度较大位于底层可以使结果尽可能大
交换长度小的节点使其位于底层,长度较大位于非底层, 可以使答案更大, 与原假设矛盾
数学证明
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
依次类推

代码

  1. #pragma GCC optimize(2)
  2. #pragma GCC optimize(3)
  3. #include<bits/stdc++.h>
  4. #define int long long
  5. #define xx first
  6. #define yy second
  7. #define ump unordered_map
  8. #define us unordered_set
  9. #define pq priority_queue
  10. #define rep(i, a, b) for(int i=a;i<b;++i)
  11. #define Rep(i, a, b) for(int i=a;i>=b;--i)
  12. using namespace std;
  13. typedef pair<int, int> PII;
  14. const int N=10005, inf=0x3f3f3f3f3f3f3f3f, mod=1e9+7;
  15. const double Exp=1e-8;
  16. //int t, n, m, cnt, ans;
  17. int w[N];
  18. inline int rd(){
  19. int s=0,w=1;
  20. char ch=getchar();
  21. while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
  22. while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
  23. return s*w;
  24. }
  25. void put(int x) {
  26. if(x<0) putchar('-'),x=-x;
  27. if(x>=10) put(x/10);
  28. putchar(x%10^48);
  29. }
  30. signed main(){
  31. ios::sync_with_stdio(false);
  32. cin.tie(0);
  33. cout.tie(0);
  34. int n=rd();
  35. rep(i, 0, n){
  36. w[i]=rd();
  37. }
  38. sort(w, w+n);
  39. rep(i, 0, n){
  40. w[0]=(w[0]+w[i])/2;
  41. }
  42. printf("%lld", w[0]);
  43. return 0;
  44. }

参考文献

AcWing 1618. 结绳(PAT甲级辅导课)y总视频讲解

原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈
在这里插入图片描述

发表评论

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

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

相关阅读

    相关 1070 (JAVA)

    给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串

    相关 1070. (25)

    给定一段一段的绳子,你需要把它们串成一条绳。每次串连的时候,是把两段绳子对折,再如下图所示套接在一起。这样得到的绳子又被当成是另一段绳子,可以再次对折去跟另一段绳子串连。每次串