• Codeforces Round 500 (Div. 2)


    比赛传送门

    A.Piles With Stones

    水题,直接输入两个数组,比较它们两个和的大小,然后输出"Yes"或"No"

    B.And

    这题还算简单,因为当一个数(And x)后,无论再怎么(And x)结果都不会变了,所以这道题的答案就只有(-1/0/1/2)四种,暴力枚举每一个数判断就好(结果我因为一个小错误,FST了)

    C.Photo of The Sky

    假设输入的数组为(a[2n]),为了方便,我们把要分成的两个可重集叫做(X)(Y)

    首先肯定要(sort)一下,使得数组有序,方便操作(下文提到的数组都是有序的)

    接下来就是分类讨论了:

    • 第一种情况:数组a的最大值和最小值都在(X)里。那么(X)的极差就是(a[2n]-a[1]),接下来我们要使(Y)的极差尽量小,我们就需要枚举一下每个元素(a[i]),因为集合里要有(n)个元素,所以对于每个(a[i]),能使(Y)的极差最小的方式就是将(a[i])~(a[i+n-1])全部放到(Y)里,所以(Y)的极差就是(min(a[i+n-1]-a[i]);iin [2,n+1])

    答案为 (min((a[i+n-1]-a[i])cdot(a[2n]-a[1]));iin [2,n+1])

    • 第二种情况:最小值((a[1]))和最大值((a[2n]))分别在(X)(Y)里。这样我们就要使(X)的最大值尽量小,(Y)的最小值尽量大,那么(X)的极差最小就为(a[n]-a[1])(Y)的极差最小为(a[2n]-a[n+1])

    答案为 ((a[n]-a[1])cdot (a[2n]-a[n+1]))

    最终的答案从这两种情况中取一个最小值就好了。

    时间复杂度(O(nlogn))(也就是排序的复杂度)

    最后提醒一句:别忘了开(mathfrak{long;long})

    上一份代码吧……

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long
    using namespace std;
    int read(){
    	int k=0; char c=getchar();
    	for(;c<'0'||c>'9';) c=getchar();
    	for(;c>='0'&&c<='9';c=getchar())
    	  k=(k<<3)+(k<<1)+c-48;
    	return k;
    }
    ll a[100010<<1],ans;
    int main(){
    	int n=read();
    	for(int i=1;i<=n<<1;i++) a[i]=read();
    	sort(a+1,a+(n<<1)+1);
    	ans=(a[n]-a[1])*(a[n<<1]-a[n+1]); //第二种情况
    	for(int i=2;i<=n+1;i++)  //第一种情况
    		ans=min((a[n<<1]-a[1])*(a[i+n-1]-a[i]),ans);
    	cout<<ans;
    	return 0;
    }
    

    然后后面的题就都不会了,(CF)止步于此……

    我果然还是太菜了……

  • 相关阅读:
    Kubernetes 架构(上)【转】
    部署 k8s Cluster(下)【转】
    部署 k8s Cluster(上)[转]
    k8s 重要概念[转]
    k8s 核心功能[转]
    5 秒创建 k8s 集群[转]
    内置函数——format
    基础数据类型(set集合)
    Oracle 传参错误
    .NET参数化Oracle查询参数
  • 原文地址:https://www.cnblogs.com/morslin/p/11853447.html
Copyright © 2020-2023  润新知