ACM PKU 1147 Binary codes http://acm.pku.edu.cn/JudgeOnline/problem?id=1147

研究了n久,原来是题意理解有问题.,,
这句话很诡异 
Then rows of the matrix are sorted in alphabetical order, where ‘0’ is before ‘1’'

经过研究,发现题意原来是这样的 : 1.所有行都是经过某一行的rotated versions 2.即上面这句话的理解:将所有的rotated versions 排序.... 3.由1和2,所以行的顺序和生成rotated versions 的顺序相比,是混乱的....

注意到有一点是确定的,同一行中最后一个数和第一个数的关系.

方法: 因为是经过按照row排序的,所以第一列肯定是排好序.第一列和最后一列对照,可得出以上说的"混乱"的顺序,保存在next数组里. 最后按照next数组的顺序排列input数据...

这题费了我一个半小时,网上也找不到任何代码和算法,确实是经典啊~~
destination[] 放输入数据,即最后一列
ans[]放第一列
next[]是根据这两列比较得到的顺序

#include <iostream>
using namespace std;

int destination[3001];
int next[3001];
bool flag[3001];
int ans[3001];

int main()
{
int n, i = 1,j=1;
int zero = 0 , one = 0;
cin >> n;
for ( ; i <= n; i++)
{
   cin >> destination[i];
   if(destination[i] == 0)
    zero++;
   else 
    one++;
}

memset(flag,1,sizeof(flag));

for(i = 1;i <= zero;ans[i++] = 0);
for(     ;i <= n   ;ans[i++] = 1);

for(i = 1; i <= n; i++)
{
   j = 1;
   while(ans[i] != destination[j] || flag[j] == 0 ) j++;
   next[i] = j;
   flag[j] = 0;
}

j = 1;
for( i = 1 ; i <= n; i++)
{
   j = next[j];
   cout<<destination[j]<<" ";  
}
cout<<endl;
return 0;
}
        
看了流牛师兄的分析写的,就这样好奉献了一次RE,很不应该啊!


posted on 2011-05-06 18:29  _Clarence  阅读(136)  评论(0编辑  收藏  举报

导航