标题:[全民编程]76道高难度C++练习题.含NOI竞赛题.欢迎挑战
只看楼主
HCL
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-6-13
得分:0 

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

2007-06-17 10:32
HCL
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-6-13
得分:0 
希望此贴可以长期存在,并把已经完成的题放在楼顶作个标记嘛~谢谢!
2007-06-17 10:33
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
放了!呵呵~~~~~~~~

Fight  to win  or  die...
2007-06-17 10:42
simonray
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2007-6-17
得分:0 

新手...有点看不懂.


^o^ i believe i can fly , i believe i can touch the sky .
2007-06-17 11:08
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
大家讨论下16题最少称几次啊?
------------------------------------------------------------------

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

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

Fight  to win  or  die...
2007-06-17 11:19
HCL
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-6-13
得分:0 

仿佛是第六题吧!帮忙看一下,如果有冗余的地方还望多提点一下
希望看起不会太痛苦! --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;

2007-06-17 12:55
HCL
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-6-13
得分:0 

//(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;
}

2007-06-17 12:55
HCL
Rank: 1
等 级:新手上路
帖 子:32
专家分:0
注 册:2007-6-13
得分:0 
16题应该可以用二分法吧!

2007-06-17 13:01
jiaju111
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2007-3-27
得分:0 
以下是引用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!
2007-06-17 13:29
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
得分:0 
以下是引用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...
2007-06-17 14:11



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-147967-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.013412 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved