zoukankan      html  css  js  c++  java
  • CodeForces

    CodeForces - 1476D Three Bags 思维

    题意

    给定三个可重集合,分别装有(n1,n2,n3)个数,每一次操作可以从一个集合中取出(b),在另一个集合中取出元素(a),将(a)替换为(a - b)

    最终会在所有集合中仅剩一个数,求出那个数最大是多少

    [1 leq n leq 3 imes 10^5\ a_i leq 10^9 ]

    分析

    容易发现一个数经过偶数次中转为正,否则为负

    通过观察样例,容易贪心构造出两种方案:

    选出来自不同的集合的且最小的两个数,将这两个数作为中转,那么最后只有这两个数会转移一次

    还有一种方法是 牺牲一个集合作为中转集合,其他所有集合都通过这个集合进行中转,这样显然也可能达到最优解

    最终只需在两种方法中取最大即可

    做这类规律题一定要冷静仔细分析

    代码

    int main(){
    	int n1 = rd();
    	int n2 = rd();
    	int n3 = rd();
    	vector<ll> Sum;
    	vector<ll> v1,v2,v3;
    	ll sum = 0;
    	for(int i = 0;i < n1;i++)
    		v1.push_back(rd()),sum += v1.back();
    	Sum.push_back(sum);
    	sum = 0; 
    	for(int i = 0;i < n2;i++)
    		v2.push_back(rd()),sum += v2.back();
    	Sum.push_back(sum);
    	sum = 0;
    	for(int i = 0;i < n3;i++)
    		v3.push_back(rd()),sum += v3.back();
    	Sum.push_back(sum);
    	ll ans = Sum[0] + Sum[1] + Sum[2];
    	sort(v1.begin(),v1.end());
    	sort(v2.begin(),v2.end());
    	sort(v3.begin(),v3.end());
    	sort(Sum.begin(),Sum.end());
    	ans -= 2 * min(Sum[0],min(v1[0] + v2[0],min(v2[0] + v3[0],v1[0] + v3[0])));
    	cout << ans;
    }
    
  • 相关阅读:
    #Leetcode# 164. Maximum Gap
    #Leetcode# 155. Min Stack
    #Leetcode# 165. Compare Version Numbers
    Linux——信息分析(四)域名分析dig、host、
    Linux——信息采集(三)dmitry、路由跟踪命令tracerouter
    密码学——cookie攻击
    final关键字
    重载与重写
    break and continue
    计算机硬件系统
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14378989.html
Copyright © 2011-2022 走看看