主题:[原创][讨论][交流]编程高手的超级训练题解析
vcacm
[专家分:1500] 发布于 2007-04-11 17:29:00
[code]
[[color=FF0000]注意: 这儿绝大部分的题目来源于信息学竞赛!
这些题目都是非常好的!如果大家能把这些题目做出来,那么可以说你
的编程能力达到了一定的水平!
关于这些题目的答案在GOOGLE/BAIDU上都能搜出来,但我:希望大家积极参 与讨论, 如果你把当中的题目做出来了可以贴出来,不过最好是要讲清自己的解题思路!
我也会把自己做出来了的题目以及解题思路发上来和大家一起交流!
如果你想学好编程,那么实践是很重要的!
我也是一个编程爱好者![/color]
[color=FF00FF] My dream is to
develop a better than Linux, Windows more popular than the OS! [/color]
有啥问题,可以联系本人: 见我的签名档!
]
第二届全国青少年信息学(计算机)奥林匹克分区联赛复赛试题
(高中组 竞赛用时:3小时)
[color=FF00FF] 编号为: gcc_1[/color]
[/code]
[quote]
1.比赛安排(20分)
设有有2 n(n<=6)个球队进行单循环比赛,计划在2 n ? 1天内完成,每个队每天进行一场比赛。设计一个比赛的安排,使在2 n ? 1天内每个队都与不同的对手比赛。
例如n=2时的比赛安排:
队 1 2 3 4
比赛 1==2 3==4 一天
1==3 2==4 二天
1==4 2==3 三天
2.数制转换(20分)
设有一个字符串A$的结构为: A$=’m<n>p’
其中m为数字串(长度<=20),而n,p均为1或2位的数字串(其中所表达的内容在2-10之间)。
程序要求:从键盘上读入A$后(不用正确性检查),将A$中的数字串m(n进制),以p进制的形式输出。
例如:A$=’48<10>8’
其意义为:将10进制数48,转换成8进制数输出。
输出结果为:48<10>=60<8>
3.挖地雷(30分)
在一个地图上有N个地窖(N<=20),每个地窖中埋有一定数量的地雷。同时,给出地窖之间的连接路径。
V1 V 2 V3 V4 V5
例如:
[题目要求]
当地窖及其连接的数据给出之后,某人可以从任一处开始挖地雷,然后可以沿着指出的连接往下挖(仅能选择一条路径),当无连接时挖地雷工作结束。设计一个挖地雷的方案,使某人能挖到最多的地雷。
输入格式: N: (表示地窖的个数)
W1,W2,W3,……WN (表示每个地窖中埋藏的地雷数量)
A12…………… . A1N
A23…………..A2N
……..
AN-1 N
输出格式:
K1--K2--……….KV (挖地雷的顺序)
MAX (挖地雷的数量)
例如:
⑩--------⑧ ④-----⑦-------⑥
其输入格式为: 输出:
5 1 ?3 -4 -5
10,8,4,7,6 max=27
1 1 1 0
0 0 0
1 1
1
4.砝码称重(30分)
设有1g、2g、3g、5g、10g、20g的砝码各若干枚(其总重<=1000),
要求:
输入方式:a1 a2 a3 a4 a5 a6
(表示1g砝码有a1个,2g砝码有a2个,…,20g砝码有a6个)
输出方式:Total=N
(N表示用这些砝码能称出的不同重量的个数,但不包括一个砝码也不用的情况)
如输入:1_1_0_0_0_0 (注:下划线表示空格)
输出:TOTAL=3 表示可以称出1g,2g,3g三种不同的重量。
[/quote]
最后更新于:2007-04-17 06:46:00
回复列表 (共83个回复)
41 楼
zeyoo [专家分:140] 发布于 2007-04-14 00:20:00
如果能够把它做成word就好了,可以把它打印出来,即使不在电脑旁没事的时候也能想一想,呆在电脑旁的时间总是有限的!
42 楼
vcacm [专家分:1500] 发布于 2007-04-14 06:53:00
[quote]如果能够把它做成word就好了,可以把它打印出来,即使不在电脑旁没事的时候也能想一想,呆在电脑旁的时间总是有限的!
[/quote]
俺就是从WORD中转换成HTM的!
你成可以用Microsoft Word 把 这些 .htm 转换成.doc
43 楼
vcacm [专家分:1500] 发布于 2007-04-14 06:55:00
[quote][quote][quote]那个FVWM是做什么的?[/quote]
LINUX和BSD……下一个很出名的 窗口管理器[/quote]
Windows上不能用咯?[/quote]
有FVWM FOR WINDOWS!
44 楼
shena995800 [专家分:170] 发布于 2007-04-14 20:54:00
我也是打了一些出来的
但是打印完了才发现有好多相同的题目....
45 楼
shena995800 [专家分:170] 发布于 2007-04-14 23:20:00
[quote]
[color=FFFFOO]GCC-1-1 /GCC-4-4 的参考答案:
方法: 分治法/递归
[/color]
[code]
/* * * name : gcc-1-1 /gcc-4-4 * * *
* * * * * *
循环赛日程安排问题
* * *==========================================* * */
#include <stdio.h>
#include <time.h>
#define MAX 101
int m[MAX][MAX] ;
int is_can (int data, int len)
{
int k ;
for(k= 1 ; k<=len ; k++)
if(data == m[k][1])
return 0 ;
return 1 ;
}
int main(int argc, char *argv[])
{
int i, j, k, h ,t;
clock_t end , begin;
//int m[MAX][MAX] ;
int n ,total = 1,go=0 ;
scanf("%d",&n );
begin = clock() ;
}
[/code][/quote]
这是C的吗?...
clock_t end , begin;
begin = clock() ;
end = clock() ;
这些有用?
46 楼
vcacm [专家分:1500] 发布于 2007-04-15 06:58:00
[quote]
这是C的吗?...
clock_t end , begin;
begin = clock() ;
end = clock() ;
这些有用?[/quote]
[color=FF00FF]大哥!
当然,你不是学得C/C++吗?
这些是用来计算程序运行时间的函数呀![/color]
47 楼
vcacm [专家分:1500] 发布于 2007-04-15 07:01:00
由于我是在LINUX下发的贴子!难免会有些错误!
请大家多多谅解!
48 楼
shena995800 [专家分:170] 发布于 2007-04-15 12:19:00
[quote][quote]
这是C的吗?...
clock_t end , begin;
begin = clock() ;
end = clock() ;
这些有用?[/quote]
[color=FF00FF]大哥!
当然,你不是学得C/C++吗?
这些是用来计算程序运行时间的函数呀![/color][/quote]
我们只学了点点C...老师只讲了些常用的.
clock_t end , begin; 这些没怎么用过....
自己又没怎么看...呵呵...因为菜所以才要看看这些题撒,.
49 楼
vcacm [专家分:1500] 发布于 2007-04-15 12:32:00
[quote][quote][quote]
这是C的吗?...
clock_t end , begin;
begin = clock() ;
end = clock() ;
这些有用?[/quote]
[color=FF00FF]大哥!
当然,你不是学得C/C++吗?
这些是用来计算程序运行时间的函数呀![/color][/quote]
我们只学了点点C...老师只讲了些常用的.
clock_t end , begin; 这些没怎么用过....
自己又没怎么看...呵呵...因为菜所以才要看看这些题撒,.[/quote]
可以原谅!!!!![em1]
50 楼
vcacm [专家分:1500] 发布于 2007-04-16 21:32:00
[color=FF00FF]
GCC-1-2 的提高版本
大家看一下这题:
大数进制转换!
我今天写了一下,一开始我以为这很容易,但当我写完以后,我无语!
虽能通过一般地数据,但是当M 达到几十位甚至几百位时,我才发现自己的代码
漏洞百出!
现在我把它优化了一下:
我试了很多数据,都能OK !
但我还是觉得还有些地方不对头!
肯请高手指点...................
[/color]
[code]
/* * * ===== name : gcc-1-2.c===========* * *
change the digit
* * * =================================* * */
#include <stdio.h>
//#include <memory.h>
#define MAX 201
#define need 1
int my_so_do (int sum[] , int lon )
{
int k ;
for(k =1 ; k<= lon ; k++)
if(sum[k] >= 10 )
{
if( sum[lon] >=10)
lon ++ ;
sum[k+1] += sum[k] / 10 ;
sum[k] %= 10 ;
}
return lon ;
}
int my_pow ( int d[], int dt , int w )
{
int p,q,v,index= 1;
d[1] = 1 ;
for( p= 1 ; p <= w ; p++)
{
for(q=1; q<=index ; q++)
d[q] *= dt ;
index = my_so_do ( d, index ) ;
}
return index ;
}
int change_to_10 ( int a[], int c[] , int dit ,int la)
{
int i,j,k ;
int d[MAX],ld = 0 ;
int lc = 0 , ln = 0 ;
memset ( c,0 , sizeof(a) ) ;
for(i = la ; i>=1 ; i--)
{
memset (d , 0 , sizeof(d) );
ld = my_pow (d , dit , i-1 ) ;
for( j= 1; j<=ld ; j++)
d[j] *= a[i] ;
ld = my_so_do ( d, ld ) ;
ln = lc < ld ? lc : ld ;
for(k =1 ; k<= ln ; k++)
c[k] += d[k] ;
if(lc < ld )
{
for( k=lc +1 ; k<=ld ; k++)
c[k] += d[k] ;
lc = ld ;
}
lc = my_so_do ( c , lc ) ;
}
return lc ;
}
[/code]
我来回复