• 蓝桥杯[OJ 3791]—珠宝的最大交替和—CPP-贪心


    一:问题描述

    二、整体思路:

    1. 观察到可以把交替和中各项分为奇数组与偶数组,最多只能交换一次,先假设要交换。
    2. 偶数组的项都要减去,奇数组的项都要加上,交替和=奇数组总和-偶数组总和,那么如果交换的两项都同时位于奇数组或偶数组内,不能使得交替和最大。因此交换的两项必须一个位于偶数组,另一个位于奇数组。
    3. 交换之后,ans_exchanged=ans_init+2*(被交换偶数-被交换奇数)

    4. 因此,遍历偶数组,得到其减去奇数组中最小项的差,找出最大的差

    5. 注意是差最大而不是最大的偶数项减去最小的奇数项

    6. 注意最后要和不交唤的情况进行比较判断

    三、代码:

    1. #include
    2. using namespace std;
    3. using ll = long long;
    4. const int n=1e6+10;
    5. int arr[n];
    6. vector<int> arr_double;
    7. vector<int> arr_single;
    8. int main(){
    9. int N;cin>>N;
    10. bool flag=true;
    11. ll ans_init=0;
    12. for(int i=1;i<=N;i++){
    13. cin>>arr[i];arr[i]=abs(arr[i]);//交替和各项都为绝对值
    14. if(flag){
    15. ans_init+=arr[i];
    16. arr_single.push_back(arr[i]);//奇数组
    17. flag=false;
    18. }else{
    19. ans_init-=arr[i];
    20. arr_double.push_back(arr[i]);//偶数组
    21. flag=true;
    22. }
    23. }
    24. sort(begin(arr_single),end(arr_single));
    25. //奇数和-偶数和,把小的奇数与比它大的偶数交换,交换之后ans_exchanged=ans_init+2*(偶数-奇数),找到最大的ans_exchanged
    26. ll subtract_max=LLONG_MIN;
    27. for(auto i:arr_double){
    28. if(i-arr_single[0] > subtract_max) subtract_max=i-arr_single[0];
    29. }
    30. cout<<max(ans_init+2*subtract_max,ans_init);//不要忘记和不交换的情况比较
    31. return 0;
    32. }

  • 相关阅读:
    cesium 添加纽约城市模型
    八大排序之插入排序
    我的设计模式之旅、12 原型模式
    Linux入门第三讲(完结)
    【JY】YJK前处理参数详解及常见问题分析:刚度系数(三)
    避坑版-OpenSSH 用户名枚举漏洞(CVE-2018-15473)
    【Java】异常处理(一)
    安全狗受邀出席CIS 2022网络安全创新大会
    Git常见场景命令总结
    mindspore安装失败
  • 原文地址:https://blog.csdn.net/2201_75413354/article/details/136574001