Pinely Round 4 (Div. 1 + Div. 2)
A. Maximize the Last Element
题意:一个数列,可以删除相邻两个数,问最后剩下的最大值是多少。
题解:求距离两端距离均为偶数的位置的最大值即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int num[N] = {};
int maxn = 0;
for(int i=1;i<=n;i++)
{
cin>>num[i];
if((i-1)%2 == 0 && (n-i)% 2 == 0)maxn = max(maxn,num[i]);
}
cout<<maxn<<endl;
}
return 0;
}
B. AND Reconstruction
题意:给定数组{
b
i
b_{i}
bi},(
i
≤
n
−
1
i\le n-1
i≤n−1),求数组{
a
i
a_{i}
ai},其中
a
i
a_{i}
ai&
a
i
+
1
a_{i+1}
ai+1=
b
i
b_{i}
bi。
题解:在二进制下
b
i
b_{i}
bi的某一个位置为1的时候,对应的
a
i
a_{i}
ai和
a
i
+
1
a_{i+1}
ai+1号位置上二级进制对应也必须为1即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 200100;
#define ll unsigned long long
ll b[N];
ll a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int maxn = 0;
for(int i=1;i<n;i++)
{
cin>>b[i];
}
memset(a,0,sizeof(a));
for(int i=1;i<=n-1;i++)
{
a[i] = a[i] | b[i];
a[i+1] = a[i+1]|b[i];
}
bool flag = true;
for(int i=1;i<n;i++)
{
ll temp = a[i] & a[i+1];
if(temp != b[i])
{
flag = false;
break;
}
}
if(flag)
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
}
else cout<<-1<<endl;
}
return 0;
}
C. Absolute Zero
题意:给一组数,每个数等于这个数减去一个数差的绝对值,问多少次后可以把整个数组变为零,同时输出每次减去的数字;如果不能全部变为零则输出-1。
题解:找到差最大的两个数,则减去这两个数的和的二分之一;同时特判其他情况即可。
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
#define ll long long
ll b[N];
ll a[N];
int main()
{
int t;
cin>>t;
while(t--)
{
int n;
cin>>n;
int maxn = 0;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
bool flag = true;
for(int i=1;i<n;i++)
{
int k = b[i+1] - b[i];
if(k&1)
{
flag = false;
break;
}
}
if(!flag)
{
cout<<-1<<endl;
}
else
{
vector<int>aa;
while(true)
{
int curren = 0,posion = 0;
bool flag1 = true;
for(int i=1;i<n;i++)
{
int g = abs(b[i+1]-b[i]);
if(curren<=g)
{
posion = i;
curren = g;
}
if(b[i]!=0 || b[i+1]!=0)
{
flag1 = false;
}
}
if(curren == 0 || flag1 )break;
int tt = (b[posion]+b[posion+1])/2;
aa.push_back(tt);
for(int i=1;i<=n;i++)
{
b[i] = abs(b[i] - tt);
}
}
if(b[1])
{
aa.push_back(b[1]);
}
cout<<aa.size()<<endl;
for(auto x : aa)
{
cout<<x<<" ";
}
cout<<endl;
}
}
return 0;
}