| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
恳求帮忙,编译错误我的编译总是报错,而在本地的vs.net和dev c++上都是正常的。此外,对一些较小的数据都是可以通过的,我手头没有比较全面的测试数据,有人能提供吗?
附上我的代码,比较长,因为不太熟悉,手生:
#include<iostream>
using namespace std;
__int64 maxnum;
__int64 up[20][20],down[20][20];
struct condition_data;
void creat_form(__int64 maxnum);
void get_line(__int64 n,__int64 p,__int64 *line);
struct condition_data{
__int64 n[21],p[21]; //n=the number of banisters;p=the serial number
};
void creat_form(__int64 maxnum){//建立up,down两个表格
__int64 pos,i,j;
for(i=1;i<=maxnum;i++)
for(j=1;j<=maxnum;j++){
up[i][j]=0;
down[i][j]=0;
}
up[1][1]=1;
down[1][1]=1;
for(pos=2;pos<=maxnum;pos++){
for(i=1;i<=pos;i++){
up[pos][i]=0;
for(j=1;j<i;j++) up[pos][i]+=down[pos-1][j];
down[pos][i]=0;
for(j=i;j<pos;j++) down[pos][i]+=up[pos-1][j];
}
}
}
void get_line(__int64 n,__int64 p,__int64 *line){//获取答案排列
__int64 i,j;
bool flag;
j=1;
while(p-up[n][j]-down[n][j]>0){
p=p-up[n][j]-down[n][j];
j++;
}
*line=j;
line++;
if(p<=up[n][j])
flag=false;
else{
p=p-up[n][j];
flag=true;
}
for(i=n-1;i>1;i--){
if(flag) {
j=*(line-1);
while(p>up[i][j]&&j<=i){
p=p-up[i][j];
j++;
}
flag=false;
}
else {
j=1;
while(p>down[i][j]&&j<*(line-1)){
p=p-down[i][j];
j++;
}
flag=true;
}
*line=j;
line++;
}
*line=1;
}
void output(__int64 *line,__int64 n){//将上面排列还原为正常数据并输出
bool is_get[21];
__int64 i,o_line[21];
for(i=1;i<=n;i++) is_get[i]=false;
__int64 j;
for(i=1;i<=n;i++){
o_line[i]=1;
while(is_get[o_line[i]]) o_line[i]++;
j=1;
while(j<*line||is_get[o_line[i]]){
if(is_get[o_line[i]]==false)j++;
o_line[i]++;
}
is_get[o_line[i]]=true;
line++;
}
cout<<o_line[1];
for(i=2;i<=n;i++){
cout<<" "<<o_line[i];
}
cout<<"\n";
}
void main(){
__int64 total;
cin>>total;
__int64 i;
maxnum=0;
condition_data condition;
for(i=0;i<total;i++){
cin>>condition.n[i]>>condition.p[i];
if (maxnum<condition.n[i]) maxnum=condition.n[i];
}
creat_form(maxnum);
__int64 *line;
for(i=0;i<total;i++){
line=new __int64[condition.n[i]];
get_line(condition.n[i],condition.p[i],line);
output(line,condition.n[i]);
delete line;
}
system("pause");
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator