给定一个只有0和1的数组。
如果Object& getObjectDependingOnMonth(std::string& month, std::vector<Object>& vec) {
if (month == "January") {
auto& ref = vec.at(1);
} else {
auto& ref = vec.at(2);
}
ref.do_something(); // error because ref is local in block above.
return ref; // error because ref is local in block above.
}
还剩0
,那么他们会交换他们的值
计算数组右侧所有0的步数。
EXAMPLE1 的 如果array = [0 1 0 0 1 0 1 0 1]
1
EXAMPLE2 的 如果array = [0 1 0 1 0]
[1 0 0 1 0 1 0 1 0]
[1 0 1 0 1 0 1 0 0]
[1 1 0 1 0 1 0 0 0]
[1 1 1 0 1 0 0 0 0]
[1 1 1 1 0 0 0 0 0]
the Answer is ```5``` steps.
答案= [1 0 1 0 0]
[1 1 0 0 0]
我编写了代码来执行所要求的操作。但是对于大尺寸阵列来说它非常慢:(请帮忙
答案 0 :(得分:0)
我认为使用A* search
和hamming
函数heuristic
可以最好地解决此问题(我们需要证明启发式是admissible
)。以下是步骤:
goal
数组(只需sort
数组descending
)。0 1
交换获得的数组。priority queue
,其中优先级定义为距源节点(sum
)和启发式函数({{1}的距离f(.)
}})来自目标节点。优先级最低的队列中的节点将首先弹出,任意断开连接。h(.)=hamming distance
节点,并将尚未访问的所有相邻节点推送到队列,更新弹出节点的源距离。goal
节点后停止。答案 1 :(得分:-2)
计算每个1的等待时间。现在取最后1个t1的等待时间,并在说出totatlz之前添加零个数。
您的#include <bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define vll vector<ll>
#define F first
#define S second
#define pll pair<ll,ll>
#define FOR1(i,a) for(i=0;i<=a;i++)
#define FOR2(i,a,b) for(i=a;i<=b;i++)
#define endl '\n'
#define clr(a) memset(a,0,sizeof(a))
#define all(x) x.begin(),x.end()
typedef long long ll;
int main()
{
ll t,i;
cin>>t;
while(t--)
{
ll n,totalz=0,interval=0,k=0,j;
cin>>n;
ll asyncTime[n]={0},a[n]={0};
bool flag=false;
FOR1(i,n-1)
cin>>a[i];
FOR1(i,n-1)
{
if(!a[i])
totalz+=1;
else
{
flag=true;
asyncTime[k]=0;
k+=1;
j=i+1;
break;
}
}
int l,lastpos;
FOR2(i,j,n-1)
{
if(!a[i])
totalz+=1,interval+=1;
else
{
if(asyncTime[k-1]>=interval)
asyncTime[k]=asyncTime[k-1]-interval+1;
else
asyncTime[k]=0;
interval=0;
k+=1;
lastpos=i;
}
}
// FOR1(i,n-1)
// cout<<a[i]<<" ";
// cout<<endl;
// FOR1(i,k-1)
// cout<<asyncTime[k]<<" ";
// cout<<endl;
if(flag)
{
if(asyncTime[k-1]==k-1&&lastpos==k-1)
cout<<"0"<<endl;
else
cout<<asyncTime[k-1]+totalz<<endl;
}
else
cout<<"0"<<endl;
}
return 0;
}
{{1}}