具有0&1和1的数组的状态数是多少

时间:2017-02-05 10:16:43

标签: arrays algorithm graph dynamic-programming

给定一个只有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]

我编写了代码来执行所要求的操作。但是对于大尺寸阵列来说它非常慢:(请帮忙

2 个答案:

答案 0 :(得分:0)

我认为使用A* searchhamming函数heuristic可以最好地解决此问题(我们需要证明启发式是admissible)。以下是步骤:

  1. 对于给定的数组,首先计算我们想要访问的goal数组(只需sort数组descending)。
  2. 将问题表示为(图)搜索问题,其中源节点是给定数组,相邻节点被定义为可以通过单个0 1交换获得的数组。
  3. 将源节点推送到priority queue,其中优先级定义为距源节点(sum)和启发式函数({{1}的距离f(.) }})来自目标节点。优先级最低的队列中的节点将首先弹出,任意断开连接。
  4. 从优先级队列中迭代弹出一个节点,直到到达h(.)=hamming distance节点,并将尚未访问的所有相邻节点推送到队列,更新弹出节点的源距离。
  5. 弹出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}}