计算机学院ACM程序设计竞赛题目Word格式.docx
《计算机学院ACM程序设计竞赛题目Word格式.docx》由会员分享,可在线阅读,更多相关《计算机学院ACM程序设计竞赛题目Word格式.docx(20页珍藏版)》请在冰点文库上搜索。
题目三
A+B
读入两个小于100的正整数A和B,计算A+B。
需要注意的是:
A和B的每一位数字由对应的英文单词给出。
测试输入包含若干测试用例,每个测试用例占一行,格式为"
A+B="
,相邻两字符串有一个空格间隔。
当A和B同时为0时输入结束,相应的结果不要输出。
对每个测试用例输出1行,即A+B的值。
one+two=
threefour+fivesix=
zeroseven+eightnine=
zero+zero=
90
96
题目四
百岛湖
相信大家都听说一个“百岛湖”的地方吧,百岛湖的居民生活在不同的小岛中,当他们想去其他的小岛时都要通过划小船来实现。
现在政府决定大力发展百岛湖,发展首先要解决的问题当然是交通问题,政府决定实现百岛湖的全畅通!
经过考察小组RPRush对百岛湖的情况充分了解后,决定在符合条件的小岛间建上桥,所谓符合条件,就是2个小岛之间的距离不能小于10米,也不能大于1000米。
当然,为了节省资金,只要求实现任意2个小岛之间有路通即可。
其中桥的价格为100元/米。
输入包括多组数据。
输入首先包括一个整数T(T<
=200),代表有T组数据。
每组数据首先是一个整数C(C<
=100),代表小岛的个数,接下来是C组坐标,代表每个小岛的坐标,这些坐标都是0<
=x,y<
=1000的整数。
每组输入数据输出一行,代表建桥的最小花费,结果保留一位小数。
如果无法实现工程以达到全部畅通,输出”oh!
”。
2
1010
2020
11
22
10001000
1414.2
oh!
题目五
Howmanyways?
?
春天到了,校园里开满了花,姹紫嫣红,非常美丽。
葱头是个爱花的人,看着校花校草竞相开放,漫步校园,心情也变得舒畅。
为了多看看这迷人的校园,葱头决定,每次上课都走不同的路线去教室,但是由于时间问题,每次只能经过k个地方,比方说,这次葱头决定经过2个地方,那他可以先去明德广场看看喷泉,再去教室,也可以先到体育场跑几圈,再到教室。
他非常想知道,从A点恰好经过k个点到达B点的方案数,当然这个数有可能非常大,所以你只要输出它模上1000的余数就可以了。
你能帮帮他么?
你可决定了葱头一天能看多少校花哦。
输入数据有多组,每组的第一行是2个整数n,m(0<
n<
=20,m<
=100)表示校园内共有n个点,为了方便起见,点从0到n-1编号,接着有m行,每行有两个整数s,t(0<
=s,t<
n)表示从s点能到t点,注意图是有向的。
接着的一行是整数T,表示有T组询问(1<
=T<
=100),接下来的T行,每行有三个整数A,B,k,表示问你从A点到B点恰好经过k个点的方案数(k<
20),可以走重复边。
如果不存在这样的走法,则输出0。
当n,m都为0的时候输入结束。
计算每次询问的方案数,由于走法很多,输出其对1000取模的结果。
44
01
02
13
23
032
033
36
10
20
12
21
121
013
00
参考答案代码
A
+
B
Problem
Description
B
="
Sample
one
two
=
three
four
five
six
zero
seven
eight
nine
*/
#include
<
stdio.h>
stdlib.h>
string.h>
struct
InPutString
{
char
Value[100];
//每次输入的计算字符串
InPutString
*
Next;
//指向下一个结构体的地址
};
int
WordsToInt(char
Value)//单个单词转换为整数值
{
if
(strcmp("
one"
Value)
==
0)
return
1;
else
two"
2;
three"
3;
four"
4;
five"
5;
six"
6;
seven"
7;
eight"
8;
nine"
9;
zero"
0;
}
CharsToInt(char
Value)//整体字符串转换为整数值
ReturnValue
=
i,
Pos0
LeftNum[10]
{'
\0'
RightNum[10]
for(i
i
100;
i++)
(Value[i]
'
)//寻找空格的位置
i;
break;
(Pos0
>
0)//找到表明是两位数
strncpy(LeftNum,
Value,
Pos0);
strncpy(RightNum,
Value
1,
strlen(Value)
-
1);
WordsToInt(LeftNum)
10
WordsToInt(RightNum);
else//是一位数
strcpy(LeftNum,
Value);
WordsToInt(strcpy(LeftNum,
Value));
ReturnValue;
SumValue(char
Value)//计算机字符串的值
LeftValue[100]
//运算式左侧
RightValue[100]
//运算式右侧
Pos0,
Pos1
+'
)//寻找
号的位置
='
strncpy(LeftValue,
//获取
左边的字符串
strncpy(RightValue,
2,
3);
//获取
右边
与
左边
的字符串
CharsToInt(LeftValue)
CharsToInt(RightValue);
main(int
argc,
char*
argv[])
pHeadInPutString
NULL;
//首指针
pUsedInPutString
//正在使用的指针
pTempInPutString
//临时使用的指针
InPut[100];
//输入数据
gets(InPut);
while(strcmp(InPut,
"
)
!
0)//表明输入数据有效
(InPutString
*)malloc(sizeof(InPutString));
//申请空间
pTempInPutString->
Next
strcpy(pTempInPutString->
InPut);
(NULL
pHeadInPutString)//头指针没有创建
则新建的是头指针
pTempInPutString;
pHeadInPutString;
else//头指针已经创建
则建立的数据放在尾部
pUsedInPutString->
//计算数据
//输出数据
while(NULL
pUsedInPutString)
printf("
%d\n"
SumValue(pUsedInPutString->
pUsedInPutString;
free(pTempInPutString);
位数对调:
输入一个三位自然数,把这个数的百位与个位数对调,输出对
调后的数。
例如:
Input
3
bit
natrue
data:
234
n=432
要求每次输入多组数据(与ACM竞赛类似),输入0时表示输入结束如:
输入为:
123
456
789
输出应该为:
321
654
987
[解]1.先确定输入数n
是否三位数,即n>
99
且n<
=999。
2.位数对调:
n=abc→cba=x
①百位数a=n整除100;
②十位数b=(n-a*100)整除10;
③个位数c=n
除以10的余数;
3.得对调后的数:
x=c*100+b*10+a
NumberNode//结构体
NumberValue;
//输入的数值
NumberNode
// 在解决复杂问题时 可以采用分函数 将问题化简分步求解。
故建立分函数CalcNumber进行百个位互换
CalcNumber(int
Number)//对三位数进行位调
//return
(Number
%
10)
100
((Number
/
100)*100)
100);
InNumber
pNumber
//链表头指针
pTempNumber
//用来表示当前指针位置的链表指针
//采用链表输入数据
scanf("
%d"
&
InNumber);
while((InNumber
0)&
&
(InNumber
999)&
100))
pTemp;
//链表临时指针
指向当前创建的结构体的地址
pTemp
(NumberNode
*)malloc(sizeof(NumberNode));
pTemp->
NumberValue
InNumber;
(pNumber
NULL)
{//头指针为空,则将新建立的链表做为头指针
pNumber;
else//若不为空,则将新建立的结构体地址加入到链表的尾部
{//
注意赋值的先后性
是指向链表当前位置的指针
pTempNumber->
}
//对结果运算并输出
while(pNumber
CalcNumber(pNumber->
NumberValue));
pNumber->
free(pTempNumber);
//释放申请的空间
此句不能掉
否则会造成内存泄露
}
n为信阳市的人数,m为需要找出的大富翁数,接下来一行输入市内n个人的财富值。
2
5
-1
1
4
0
Moneybags//富翁的结构体
Value;
//富翁的金钱数
Moneybags
//指向下一个富翁结构体的地址
GroupData//每组测试用例的结构体
MoneybagsNumber;
//输入的富翁数总个数n
CountMoneybagsNumber;
//需要输出的前m个大富翁的数值m
MoneybagsLinks;
//指向当前的第一个富翁
GroupData
NextGroupData;
//指向下一组数据
void
SortData(GroupData
pHeadGroup)//对数据进行排序
pGroup
//当时使用的组数据指针
pMoneybagsTemp0
//临时使用的富翁数据指针
pMoneybagsTemp1
//临时使用的富翁数据指针
pHeadGroup;
j,
MaxValue
while(pGroup
NULL)//数据组的循环
pGroup->
j
pMoneybagsTemp0)//冒泡排序的循环此处使用冒泡排序
pMoneybagsTemp0->
pMoneybagsTemp1)
(MaxValue
pMoneybagsTemp1->
Value)
MaxValue;
j++;
PrintData(GroupData
pHeadGroup)//对数据进行输出
pGroupTemp
//临时使用的组数据指针
//当时使用的组数据指针
pMoneybagsTemp0)
(j
i)
%d
pMoneybagsTemp0;
free(pMoneybagsTemp1);
\n"
);
pGroup;
free(pGroupTemp);
//释放申请的空间
n
//输入的富翁个数n的临时变量
m
//需要输出的富翁个数m的临时变量
pHeadGroup
//组数据的头指针
n);
m);
while((0
n)&
(0
m))//n,m都不为0时
pGroupTemp;
(GroupData
*)malloc(sizeof(GroupData));
//赋初值
pGroupTemp->
MoneybagsNumber
n;
CountMoneybagsNumber
m;
NextGroupData
MoneybagsLinks
pHeadGroup)//头指针没有创建
MoneyValue
pMoneybags
//当前正在使用的富翁数据指针
pM