杭州电子科技大学acm习题集锦文档格式.docx
- 文档编号:22394646
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:36
- 大小:38.37KB
杭州电子科技大学acm习题集锦文档格式.docx
《杭州电子科技大学acm习题集锦文档格式.docx》由会员分享,可在线阅读,更多相关《杭州电子科技大学acm习题集锦文档格式.docx(36页珍藏版)》请在冰豆网上搜索。
{
intn;
inti,j;
memset(arr,0,MAX*MAX*sizeof(int));
scanf("
%d"
&
n);
for(i=0;
i<
n;
i++)//输入数塔
for(j=0;
j<
=i;
j++){scanf("
arr[i][j][0]);
arr[i][j][1]=arr[i][j][0];
}
for(i=n-2;
i>
=0;
i--)
{
j++)
if(arr[i+1][j][1]>
arr[i+1][j+1][1])arr[i][j][1]+=arr[i+1][j][1];
elsearr[i][j][1]+=arr[i+1][j+1][1];
printf("
%d\n"
arr[0][0][1]);
}
intmain()
intnum;
num);
while(num--){res();
return0;
免费馅饼
都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。
说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。
馅饼如果掉在了地上当然就不能吃了,所以gameboy马上卸下身上的背包去接。
但由于小径两侧都不能站人,所以他只能在小径上接。
由于gameboy平时老呆在房间里玩游戏,虽然在游戏中是个身手敏捷的高手,但在现实中运动神经特别迟钝,每秒种只有在移动不超过一米的范围内接住坠落的馅饼。
现在给这条小径如图标上坐标:
为了使问题简化,假设在接下来的一段时间里,馅饼都掉落在0-10这11个位置。
开始时gameboy站在5这个位置,因此在第一秒,他只能接到4,5,6这三个位置中期中一个位置上的馅饼。
问gameboy最多可能接到多少个馅饼?
(假设他的背包可以容纳无穷多个馅饼)
输入数据有多组。
每组数据的第一行为以正整数n(0<
n<
100000),表示有n个馅饼掉在这条小径上。
在结下来的n行中,每行有两个整数x,T(0<
T<
100000),表示在第T秒有一个馅饼掉在x点上。
同一秒钟在同一点上可能掉下多个馅饼。
n=0时输入结束。
每一组输入数据对应一行输出。
输出一个整数m,表示gameboy最多可能接到m个馅饼。
6
51
41
61
72
83
SampleOutput
4
#defineMAX100001
intarr[MAX][13];
intMax(intn1,intn2,intn3)
intmax;
max=(n1>
n2)?
n1:
n2;
max=(max>
n3)?
max:
n3;
returnmax;
voidres(intnum)
intn,m,count=-1;
memset(arr,0,MAX*13*sizeof(int));
num;
i++)
%d%d"
n,&
m);
arr[m][n+1]++;
if(count<
m)count=m;
for(i=count-1;
for(j=1;
=11;
arr[i][j]+=Max(arr[i+1][j-1],arr[i+1][j],arr[i+1][j+1]);
arr[0][6]);
while(num)
res(num);
并查集类问题
畅通工程
某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。
省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。
问最少还需要建设多少条道路?
测试输入包含若干测试用例。
每个测试用例的第1行给出两个正整数,分别是城镇数目N(<
1000)和道路数目M;
随后的M行对应M条道路,每行给出一对正整数,分别是该条道路直接连通的两个城镇的编号。
为简单起见,城镇从1到N编号。
注意:
两个城市之间可以有多条道路相通,也就是说
33
12
21
这种输入也是合法的
当N为0时,输入结束,该用例不被处理。
对每个测试用例,在1行里输出最少还需要建设的道路数目。
42
13
43
23
52
35
9990
2
998
#include<
#defineMAX2000
intn,m;
intarr[MAX][2];
intres[MAX];
intset;
voidproc()
intrest;
set=1;
//用来统计集合个数
memset(res,0,(n+1)*sizeof(int));
res[arr[0][0]]=res[arr[0][1]]=1;
for(i=1;
=set;
m;
if(res[arr[j][0]]*res[arr[j][1]])continue;
//当前数据已经归类,则不进行任何操作
if(res[arr[j][0]]==i||res[arr[j][1]]==i)
res[arr[j][0]]=res[arr[j][1]]=i;
//对数据进行集合划分
j=-1;
//从第一组元素开始继续遍历
if(res[arr[j][0]]*res[arr[j][1]]==0)break;
//遇到首或尾没有归类的情况的时候跳出
if(j<
m)set++;
//如果当前还有没有归类的情况新增加一个集合
elsebreak;
//如果当前数据全部归类则跳出所有循环
if(res[arr[j][0]]*res[arr[j][1]]==0){res[arr[j][0]]=res[arr[j][1]]=set;
break;
rest=0;
=n;
i++)if(res[i]==0)rest++;
if(m==0)printf("
n-1);
elseif(rest==0)
if(set==1)printf("
0\n"
);
elseprintf("
set-1);
rest+set-1);
inti;
while(n)
i++)scanf("
%d%d"
arr[i][0],&
arr[i][1]);
proc();
howmanytables
TodayisIgnatius'
birthday.Heinvitesalotoffriends.Nowit'
sdinnertime.Ignatiuswantstoknowhowmanytablesheneedsatleast.Youhavetonoticethatnotallthefriendsknoweachother,andallthefriendsdonotwanttostaywithstrangers.
OneimportantruleforthisproblemisthatifItellyouAknowsB,andBknowsC,thatmeansA,B,Cknoweachother,sotheycanstayinonetable.
Forexample:
IfItellyouAknowsB,BknowsC,andDknowsE,soA,B,Ccanstayinonetable,andD,Ehavetostayintheotherone.SoIgnatiusneeds2tablesatleast.
TheinputstartswithanintegerT(1<
=T<
=25)whichindicatethenumberoftestcases.ThenTtestcasesfollow.EachtestcasestartswithtwointegersNandM(1<
=N,M<
=1000).Nindicatesthenumberoffriends,thefriendsaremarkedfrom1toN.ThenMlinesfollow.EachlineconsistsoftwointegersAandB(A!
=B),thatmeansfriendAandfriendBknoweachother.Therewillbeablanklinebetweentwocases.
Foreachtestcase,justoutputhowmanytablesIgnatiusneedsatleast.DoNOTprintanyblanks.
53
45
25
intstart[MAX],end[MAX];
intres;
intarr[MAX];
intlen;
intMempty()
if(start[i]!
=0)return0;
return1;
intinSet(intindex)
res;
if(arr[i]==index)return1;
voiddeal()
intspace=0;
if(start[i]==0)space++;
else{start[i-space]=start[i];
end[i-space]=end[i];
m=m-space;
intj;
while(!
Mempty())
i=0;
while(i<
m)
if(start[i]==0){i++;
continue;
if(i==0)
=end[i]){arr[res++]=start[i];
arr[res++]=end[i];
elsearr[res++]=start[i];
start[i]=end[i]=0;
else
if(arr[j]==start[i])
if(!
inSet(end[i]))arr[res++]=end[i];
i=-1;
if(arr[j]==end[i])
inSet(start[i]))arr[res++]=start[i];
i++;
len++;
deal();
if(res==n)len--;
elselen+=n-res-1;
while(num--)
start[i],&
end[i]);
res=0;
len=0;
len+1);
递推类问题
1、RPG问题(简单的递推问题)
有排成一行的n个方格,用红(Red)、粉(Pink)、绿(Green)三色涂每个格子,每格涂一色,要求任何相邻的方格不能同色,且首尾两格也不同色.求全部的满足要求的涂法.
输入为方格数N(0<
=N<
=50),输出为满足要求的涂法
递推公式:
f(n)=f(n-1)+2*f(n-2)
__int64i,arr[51];
__int64num;
arr[0]=0;
arr[1]=3;
arr[2]=6;
arr[3]=6;
for(i=4;
51;
arr[i]=arr[i-1]+2*arr[i-2];
while(scanf("
num)!
=EOF)
%I64d\n"
arr[num]);
2、考新郎(错排系列递推)
国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"
考新郎"
具体的操作是这样的:
首先,给每位新娘打扮得几乎一模一样,并盖上大大的红盖头随机坐成一排;
然后,让各位新郎寻找自己的新娘.每人只准找一个,并且不允许多人找一个.最后,揭开盖头,如果找错了对象就要当众跪搓衣板..
假设一共有N对新婚夫妇,其中有M个新郎找错了新娘,求发生这种情况一共有多少种可能.
输入数据的第一行是一个整数C,表示测试实例的个数,然后是C行数据,每行包含两个整数N和M(1<
M<
=20)。
对于每个测试实例,请输出一共有多少种发生这种情况的可能,每个实例的输出占一行。
错排类递推公式为:
f(n)=(m-1)*[f(n-1)+f(n-2)],其中m表示错排的个数(即错排的新人对数),n表示全部的新人个数。
intmain(void)
inti,m,n;
__int64a[21][2]={{1,0},{1,0},{2,1},{6,2}};
for(i=4;
i<
21;
i++)
a[i][0]=i*a[i-1][0];
a[i][1]=(i-1)*(a[i-1][1]+a[i-2][1]);
&
i);
while(i--&
&
n,&
m))
a[n][0]/a[m][0]/a[n-m][0]*a[m][1]);
动态规划系列
HowtoType
Pirateshavefinisheddevelopingthetypingsoftware.HecalledCathytotesthistypingsoftware.Sheisgoodatthinking.Aftertestingforseveraldays,shefindsthatifshetypesastringbysomeways,shewilltypethekeyatleast.Butshehasabadhabitthatifthecapslockison,shemustturnoffit,aftershefinishestyping.Nowshewantstoknowthesmallesttimesoftypingthekeytofinishtypingastring.
Thefirstlineisanintegert(t<
=100),whichisthenumberoftestcaseintheinputfile.Foreachtestcase,thereisonlyonestringwhichconsistsoflowercaseletteranduppercaseletter.Thelengthofthestringisatmost100.
Foreachtestcase,youmustoutputthesmallesttimesoftypingthekeytofinishtypingthisstring.
3
Pirates
HDUacm
HDUACM
8
#defineMAX200
intarr[MAX][4];
charstr[MAX];
intletter(charch)
if(ch>
='
A'
ch<
Z'
)return1;
inttmp,min;
intlen=strlen(str);
len;
if(i==0)
if(letter(str[i])){arr[i][1]=2;
arr[i][2]=2;
else{arr[i][0]=1;
arr[i][3]=3;
if(letter(str[i])==letter(str[i-1]))
if(arr[i-1][0]){arr[i][0]=arr[i-1][0]+1;
arr[i][3]=arr[i-1][0]+3;
if(arr[i-1][1]){arr[i][1]=arr[i-1][1]+2;
arr[i][2]=arr[i-1][1]+2;
if(arr[i-1][2])
if(arr[i][0]>
arr[i-1][2]+1||!
arr[i][0])arr[i][0]=arr[i-1][2]+1;
if(arr[i][3]>
arr[i-1][2]+3||!
arr[i][3])arr[i][3]=arr[i-1][2]+3;
if(arr[i-1][3])
if(arr[i][1]>
arr[i-1][3]+2||!
arr[i][1])arr[i][1]=arr[i-1][3]+2;
if(arr[i][2]>
arr[i][2])arr[i][2]=arr[i-1][3]+2;
if(arr[i-1][0]){arr[i][1]=arr[i-1][0]+2;
arr[i][2]=arr[i-1][0]+2;
if(arr[i-1][1]){arr[i][0]=arr[i-1][1]+1;
arr[i][3]=arr[i-1][1]+3;
arr[i-1][2]+2||!
arr[i][1])arr[i][1]=arr[i-1][2]+2;
arr[i][2])arr[i][2]=arr[i-1][2]+2;
if(arr[i][0]>
arr[i-1][3]+1||!
arr[i][0])arr[i][0]=arr[i-1][3]+1;
arr[
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 杭州 电子科技大学 acm 习题 集锦