编程中国 | 业界新闻 | 技术文章 | 视频教程 | 下载频道 | 程序源码 | 个人空间 | 编程论坛  
全能 ASP / PHP / ASP.NET 主机,支持月付专业 MSSQL 数据库空间,支持月付专业 MySQL 数据库空间,支持月付学习型 ASP/PHP/ASP.NET 主机 30元/年
发新话题
打印

[全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战

第五题那个我是用VC6.0写的,对于正整数都可以,没有考虑其他的!

TOP

希望此贴可以长期存在,并把已经完成的题放在楼顶作个标记嘛~谢谢!

TOP

放了!呵呵~~~~~~~~
Fight  to win  or  die...

TOP

新手...有点看不懂.

^o^ i believe i can fly , i believe i can touch the sky .

TOP

大家讨论下16题最少称几次啊?
------------------------------------------------------------------

16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
比较次数挑出伪造硬币,并鉴定它是重还是轻。

------------------------------------------------------------------
我用4次似乎多了!
Fight  to win  or  die...

TOP

仿佛是第六题吧!帮忙看一下,如果有冗余的地方还望多提点一下
希望看起不会太痛苦! --VC6.0
#include <iostream>
#include <iomanip>
#include <vector>

using namespace std;

int main()
{
cout <<"Enter a number : ";
int number;
cin >>number;
int total = number * number;
int i = 0;
int j = 0;
//(1):
for (i = 0 ; i < number ; ++i)
{
for (j = 0 ; j < number ; ++j)
{
cout <<setw(5)<<total;
total -= 1;
}
cout <<endl;
}
cout <<endl;

//(2)
i = 0;
j = 0;
int num = 1;
vector< vector<int> > a;
a.resize(number);
for (int x = 0; x < number; ++x)
a[x].resize(number);
while(num <= number * number)
{
if(i == 0 || j == number)
{
if(j == number){
i+=1;
j--;
}
for(; j >= 0 && i != number; --j){
a[i][j] = num;
num++;
i++;
}
++j;
}
else if (j == 0 || i == number)
{
if (i == number){
j+=1;
i--;
}
for(; i >= 0 && j != number; --i){
a[i][j] = num;
num++;
j++;
}
++i;
}

}
for ( i = 0 ; i < number ; ++i)
{
for (int j = 0 ; j < number ; ++j)
cout <<setw(5)<<a[i][j];
cout <<endl;
}
cout <<endl;

TOP

//(3)
i = 0;
j = 0;
num = 0;
vector< vector<int> > b;
b.resize(number);
for (int y = 0; y < number; ++y)
b[y].resize(number);
int temp1 = 0;
int temp2 = number - 1;
for (int t = 0; t <= number/2; t++, temp1++,temp2--,++i,++j)
{
for(i = temp1; i < temp2; i++)
b[i][j] = ++num;
for(j = temp1; j < temp2; j++)
b[i][j] = ++num;
for(i = temp2; i > temp1; i--)
b[i][j] = ++num;
for(j = temp2; j > temp1; j--)
b[i][j] = ++num;
if(temp1 == temp2)
b[temp1][temp2] = ++num;
}

for ( i = 0 ; i < number ; ++i)
{
for (int j = 0 ; j < number ; ++j)
cout <<setw(5)<<b[i][j];
cout <<endl;
}
cout <<endl;
return 0;
}

TOP

16题应该可以用二分法吧!

TOP

以下是引用aipb2007在2007-6-17 11:19:51的发言:
大家讨论下16题最少称几次啊?
------------------------------------------------------------------

16. 设有8枚硬币a,b,c,d,e,f,g,h,其中有一枚硬币是伪造的。
真伪硬币的区别仅是重量不同,可能重,可能轻。今要求以天平为工具,用最少的
比较次数挑出伪造硬币,并鉴定它是重还是轻。

------------------------------------------------------------------
我用4次似乎多了!

3次就够了吧

第一次 a,b,c 对 d,e,f 若平衡……(简单)

若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)

第二次 b,c,d对e,f,g

若平衡 则a偏重,问题解决

若不平衡(如果仍然是左边重)则是b,或c偏重,再称一次就解决了
(如果是左边轻)则是d偏轻,问题解决

Everything is gonna be okay!

TOP

以下是引用jiaju111在2007-6-17 13:29:09的发言:

3次就够了吧

第一次 a,b,c 对 d,e,f 若平衡……(简单)

若不平衡(如果左边重)(如果右边重同样道理,因为题目是对称的)

第二次 b,c,d对e,f,g

若平衡 则a偏重,问题解决

若不平衡(如果仍然是左边重)则是b,或c偏重,再称一次就解决了
(如果是左边轻)则是d偏轻,问题解决

帅就一个字!!!
呵呵

Fight  to win  or  die...

TOP

发新话题