当前位置: 代码迷 >> C语言 >> 编程中国C语言编程竞赛9.8 BY S.K卧龙孔明
  详细解决方案

编程中国C语言编程竞赛9.8 BY S.K卧龙孔明

热度:233   发布时间:2007-09-08 22:57:09.0
以下是引用andyzhshg在2007-9-8 22:49:25的发言:

唉,只做了一题,还是不发了吧。
看来里高手水平还差很远很远啊。


楼主什么时候发答案呢?
楼主最好把你的输入文件和输出文件先发上来,让我们这些没交上卷子的人自己先测测成绩。

如果他愿意的话,早就是用OJ了,你们测试就不用等那么久或者等到结束了



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
----------------解决方案--------------------------------------------------------

忘拉
还是在水区看到的
偶说过要来的
做拉一个 也就是第一的个 应该是最简单的一个

还是发上来嘛



----------------解决方案--------------------------------------------------------
以下是引用卧龙孔明在2007-9-8 22:34:10的发言:
时间到,测试工作正式进行,如果您还有程序未发,请于22:40前发上,否则不予以测评

原来时间早到拉


----------------解决方案--------------------------------------------------------

回复:(卧龙孔明)编程中国C语言编程竞赛9.8 BY S.K卧...
[UserName=卧龙孔明]


虽然时间已经到了```
但是我还是想知道我的程序到底怎么样```

孔名```能帮我把输入和输出改一下``再调试一下```

然后把结果发上来啊``

谢谢了``


[/UserName]
----------------解决方案--------------------------------------------------------
回复:(卧龙孔明)编程中国C语言编程竞赛9.8 BY S.K卧...
时间来不及了,只作出了一个。

[此贴子已经被作者于2007-9-8 23:37:17编辑过]


----------------解决方案--------------------------------------------------------

第3题似乎可以用线段树做到O(nlogn)的算法。不过题目没说增量的范围,如果增量都不大,直接用next_permutation就可以搞定了。


----------------解决方案--------------------------------------------------------
回复:(leeco)第3题似乎可以用线段树做到O(nlogn)的...
怎么建树??
----------------解决方案--------------------------------------------------------
OH HOHOHOHO 忙着做系统,都很少来看了。
下次我也来

----------------解决方案--------------------------------------------------------
下次
----------------解决方案--------------------------------------------------------
木卫二计数法的超吊代码

我的解法就是不停的制造排列,然后通过排列匹配起始位置,打开计数器,然后计数器=第二个变量时,计算终止,打印信息。
该解法可以支持下面的条件
input:
1
8
1
output:
3 2 1
如:
input value 1:
6
input value 2:
8888888
input value 3:
1 3 2 4 6 5
2 5 6 4 8 10 1 7 9 3 11
请各位验证!!!


//-------------------------------------------------------------

int MAX_COUNT;
int sum=-1,OFFSET=0;
int arr0[100];//输入的数组

//交换元素位置
void switchpos(int * arr, int x, int y)
{
int tempv;
tempv = arr[x];
arr[x]=arr[y];
arr[y] = tempv;
}
//判断数组是否完全相等
int comparearr(int * arr1, int* arr2, int length)
{
for (int x=0;x<length;x++)
{
if (arr1[x]!=arr2[x])
{
return -1;
}
}
return 0;
}
//递归函数,主要是获取一个定长数组的所有排列的情况
bool getlist(int *intarr,int *arrhead,int n)
{
if (sum==OFFSET) return true;
int *arrtemp= new int[n];
int *headtemp= new int[MAX_COUNT];
for (int x=0;x<MAX_COUNT;x++)
headtemp[x]= arrhead[x];
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
for (int x=0;x<n;x++)
{
arrtemp[x]=intarr[x];
}
if (n>1)
{
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
for (int i=0;i<n;i++) //在循环中调用递归函数,每次循环将数组第一位依次和后面的每一位进行交换
{
if (i!=0)
{
switchpos(arrtemp,0,i);
if (sum<0)
{
sum=comparearr(arr0,headtemp,n);
}
else
{
sum++;
}
for (int x=0;x<n;x++)
{
headtemp[MAX_COUNT-n+x]= arrtemp[x];
}

if (sum==OFFSET)
{
for (int x=0;x<MAX_COUNT;x++)
cout<<headtemp[x]<<" ";
cout<<endl;
getchar();
return true;
}

}
headtemp[MAX_COUNT-n]= arrtemp[0];
getlist(arrtemp+1,headtemp, n-1);
if (sum==OFFSET) return true;
}
}
delete []arrtemp;
delete []headtemp;
return 0;
}

int main( void )
{
int overcount;
cout<<"input value 1:"<<endl;
cin>>MAX_COUNT;
cout<<"input value 2:"<<endl;
cin>>OFFSET;
cout<<"input value 3:"<<endl;
for (int i=0; i<MAX_COUNT; i++)
cin>>arr0[i];
int arr [100];//自动生成当前位数的初始顺序
int arrhead [100];
for (int i=0;i<MAX_COUNT;i++)
{
arr[i]= i+1;
arrhead[i]= i+1;
}
while (!getlist(arr,arrhead,MAX_COUNT))//循环调用递归函数比如:3个元素的判断完了还没有达到,则判断4个元素的
{
MAX_COUNT++;
if (sum>=0) sum++;
for (int i=0;i<MAX_COUNT;i++)
{
arr[i]= i+1;
arrhead[i]= i+1;
}
if (sum==OFFSET)
{
for (int i=0;i<MAX_COUNT;i++)
{
cout<<arr[i]<<"";
}
cout<<endl;
break;
}
}
getchar();
return 0;
}


----------------解决方案--------------------------------------------------------
  相关解决方案