Codeforces Round #618 Div. 2
比赛链接 https://codeforces.com/contest/1300
比赛记录 https://blog.csdn.net/cheng__yu_/article/details/105395197
C. Anu Has a Function(式子转换)
题意:让你重新给数组排序,使得f(x,y)的最终结果最大
思路:显然 x |y -y 是个减法,化简一下就是: x - x&y,所以如果在所有数里面如果某一位出现过两次,那么肯定会被减去。把最高的出现过一次的数放在第一个位置,即可
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10,inf=1e9;
int n;
int a[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
int p=0;
for(int i=30;i>=0;--i)
{
int cnt=0;
for(int j=1;j<=n;++j)
{
if(a[j]>>i&1)
cnt++,p=j;
if(cnt==2)
{
p=0;
break;
}
}
if(cnt==1)
break;
}
if(p!=0) swap(a[1],a[p]);
for(int i=1;i<=n;++i)
cout<<a[i]<<" ";
return 0;
}
D. Aerodynamic
题意:将给定图形的边移动到原点上绕一圈,问形成的图形是否相似
思路:给定图形是中心对称即可
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e5+10,inf=1e9;
int n;
int x[maxn],y[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>x[i]>>y[i];
if(n&1)
{
puts("NO");
return 0;
}
bool ok=1;
for(int i=1;i<=n/2;++i)
{
if(x[i]+x[i+n/2]!=x[1]+x[1+n/2]||y[i]+y[i+n/2]!=y[1]+y[1+n/2])
{
ok=0;
break;
}
}
puts(ok?"YES":"NO");
return 0;
}
E. Water Balance
题意:多个水槽里的水可以平均分配,要求最后的字典序最小
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int maxn=1e6+10,inf=1e9;
int n,a[maxn],cnt[maxn];
double b[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
int p=0;
for(int i=1;i<=n;++i)
{
b[++p]=a[i];
cnt[p]++;
while(p-1>=1&&b[p]<b[p-1])
{
b[p-1]=(b[p-1]*cnt[p-1]+b[p]*cnt[p])/(cnt[p-1]+cnt[p]);
cnt[p-1]+=cnt[p];
cnt[p]=0;
p--;
}
}
for(int i=1;i<=p;++i)
for(int j=1;j<=cnt[i];++j)
printf("%.10lf\n",b[i]);
return 0;
}