A. Array Balancing
【题目简述】可交换a[n]、b[n]下标相同的元素,找 的最小值
【ps】写题的时候没有想到那么简单,写的递归可以直接一个for搞定,直接贪心,对每一个i-1到i,选择跨度少的那种情况
#include<bits/stdc++.h>
using namespace std;
int n;
int x[30],y[30];
long long ans=1e9;
void tryy(int a[],int b[],int k,long long sum){
if(k==n+1)
{
ans=sum;
return;
}
if( abs(a[k]-a[k-1])+abs(b[k]-b[k-1]) >= abs(a[k]-b[k-1])+abs(b[k]-a[k-1]) )
{
int md=a[k];
a[k]=b[k];
b[k]=md;
tryy(a,b,k+1,sum+abs(a[k]-a[k-1])+abs(b[k]-b[k-1]) );
}else tryy(a,b,k+1,sum+abs(a[k]-a[k-1])+abs(b[k]-b[k-1]) );
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int t;
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>x[i];
}
for(int i=1;i<=n;i++){
cin>>y[i];
}
tryy(x,y,2,0);
cout<<ans<<endl;
}
}
B. Getting Zero
【题目简述】
假设你有一个整数 v。在一个操作中,你可以:
要么设置 v=(v+1)mod32768
或设置 v=(2⋅v)mod32768。
给你 n 个整数 a1,a2,…,an。 使每个 ai 等于 0 所需的最少操作数是多少?
【解题】bfs,样例过了但第二个点错了,因为没有特判!0的时候要先特判一下!
用q队列,再用dep记录一下每个数的层次。记得每个样例之前要初始化。
#include<bits/stdc++.h>
using namespace std;
const int mo=32768;
queue<int>q;
int dep[40000];
int a,pre,nex;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--)
{
memset(dep,0,sizeof(dep));
q=queue<int>();
cin>>a;
q.push(a);
dep[a]=0;
if(a==0){
q.pop();
cout<<0<<" "[t==0];
}
while(!q.empty())
{
pre=q.front();
q.pop();
nex=(pre+1)%mo;
if(!dep[nex])
{
dep[nex]=dep[pre]+1;
q.push(nex);
if(nex==0)
{
cout<<dep[nex]<<" "[t==0];
break;
}
}
nex=(pre*2)%mo;
if(!dep[nex])
{
dep[nex]=dep[pre]+1;
q.push(nex);
if(nex==0)
{
cout<<dep[nex]<<" "[t==0];
break;
}
}
}
}
return 0;
}