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])\;i\in [2,n+1]\)
答案为 \(\min((a[i+n-1]-a[i])\cdot(a[2n]-a[1]))\;i\in [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\)止步于此……
我果然还是太菜了……