• 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;
    }
    
  • 相关阅读:
    Silverlight如何logging?
    写一个Attribute用于标注类的核心函数, 方便阅读
    WPF : 如何使用DataTemplateSelector
    WPF : 性能调整
    组成UI的元素
    DemoFlowControl
    对象设计: 数据边界(Data Scope)
    sql for xml path用法
    行列转置快速实现
    js移除数组中德重复数据
  • 原文地址:https://www.cnblogs.com/hznumqf/p/14378989.html
Copyright © 2020-2023  润新知