题目.docx
《题目.docx》由会员分享,可在线阅读,更多相关《题目.docx(80页珍藏版)》请在冰豆网上搜索。
题目
(数据结构)冒泡排序
TimeLimit:
2000MSMemoryLimit:
30000KB
TotalSubmit:
151Accepted:
68
Description
给定N个整数的序列,要求使用冒泡排序输出从小到大排序的结果,并输出每一次交换的数字.
Input
第一行是整数N(1<=N<=5000)表示要排序数的个数
接下去的一行是N个整数,每个整数Ni的范围在int的显示范围内.
Output
首先输出冒泡排序中所需要交换的数字Xi,Yi(相等的不需要交换,两个数字之间有一个空格),每次交换输出一行.
最后一行输出排好序的N个数(从小到大),两个数字之间有一个空格
SampleInput
5
32124
SampleOutput
32
21
32
32
12234
Source
数据结构练习
[Submit][States][Discuss]
这题开始的代码,居然是No-OutputLimitExceed:
#include
intline[5002];
intmain()
{
intn,i,j;
inttemp;
while(scanf("%d",&n))
{
for(i=0;i scanf("%d",&line[i]);
for(i=0;i for(j=i+1;j if(line[j] printf("%d%d\n",line[i],line[j]);
temp=line[i];line[i]=line[j];line[j]=temp;
}
}
}
printf("%d",line[0]);
for(i=1;i printf("%d",line[i]);
printf("\n");
}
return0;
}
原来这题只要一个case就行了,总是惯性思维的会搞成多case的,去掉while循环就能AC:
#include
intline[5002];
intmain()
{
intn,i,j;
inttemp;
scanf("%d",&n);
for(i=0;i scanf("%d",&line[i]);
for(i=0;i for(j=i+1;j if(line[j] printf("%d%d\n",line[i],line[j]);
temp=line[i];line[i]=line[j];line[j]=temp;
}
}
}
printf("%d",line[0]);
for(i=1;i printf("%d",line[i]);
return0;
}
整数的拆分
TimeLimit:
1000MSMemoryLimit:
30000KB
TotalSubmit:
325Accepted:
125
Description
给定一个整数,求有多少种拆分的方法.
例如对于2,有两程拆分方法
1+1=2
0+2=2
(2+0和0+2是一样的)
拆分的数必须为非负整数,-1+3和1.5+0.5都是不正确的拆分方法
Input
本题有多组测试数据,每组一行,每行有一个正整数N(1<=N<=100)
Output
每组测试数据输出一行,表示有多少种拆分方法
SampleInput
1
3
5
SampleOutput
1
3
7
Source
EOJ
[Submit][States][Discuss]
这题是大牛参考discuss里的TLE代码修改的:
#include
usingnamespacestd;
intans[105][105];
intnum_del(intn,intm)
{
if(ans[n][m]!
=-1)
returnans[n][m];
if(n==1||m==1)
{
ans[n][m]=1;
return1;
}
if(n{
ans[n][m]=num_del(n,n);
returnans[n][m];
}
if(n==m)
{
ans[n][m]=num_del(n,m-1)+1;
returnans[n][m];
}
ans[n][m]=num_del(n,m-1)+num_del(n-m,m);
returnans[n][m];
}
intmain()
{
intn;
memset(ans,-1,sizeof(ans));
while(1==scanf("%d",&n))
{
printf("%d",num_del(n,n));
printf("\n");
}
return0;
}
Zero
TimeLimit:
1000MSMemoryLimit:
30000KB
TotalSubmit:
394Accepted:
196
Description
Alongtimeagopeoplefoundthevaluezerotobeveryuseful.Justthinkabouttheromansandmanymorenationsthatdidn'tknowthezero.Theirnumberrepresentationscouldn'tdisplaythezeroandthat'swhytheyaredeadnow.
Soyou'vegottounderstandtheoverwhelmingimportanceofthisbeautifulgiftofscience(ornature?
)andpraisethezero.That'swhatyou'lldohere.
Findouthowmanytrailingzerosareattheendofn!
(nfactorial).That'sallyouhavetodo,butbecarefultowriteanefficientprogram,ncanbereallylarge.Forexample,
42!
=1405006117752879898543142606244511569936384000000000
sotheanswerforn=42wouldbe9,sincethereareninezerosattheend.
Input
Thefirstlinecontainsanintegerm,thenumberoftestcases.Afterthatfollowmlines.Everylinerepresentsonetestcase,whichonlycontainstheintegernumbern.Thevalueofnwillbeatleast1andwon'tbebiggerthan2.000.000.000.
Output
Foreachtestcase,printalinecontainingthenumberoftrailingzeros.Donotprintwhitespacebeforeorafterthenumber.
SampleInput
4
1
23
42
2000000000
SampleOutput
0
4
9
499999997
Source
FreshmanProgrammingContest
[Submit][States][Discuss]
这题还是大牛教的...伤心...
,不知为何用C++提交是CompileError,必须用G++提交才能AC:
#include
usingnamespacestd;
intmain()
{
longlongn;
intt;
cin>>t;
while(t--)
{
cin>>n;
longlongk=5;
longlongans=0;
while(k<=n)
{
ans+=n/k;
k*=5;
}
cout<}
return0;
}
不同的编译器:
GCCG++CC++的区别
gcc是c的编译器,g++是c++的编译器。
cc一般是一个符号连接,指向gcc。
CC一般是makefile里面的一个名字,具体是什么根据实际情况决定。
gcc和g++都是GNU(组织)的一个编译器。
误区一:
gcc只能编译c代码,g++只能编译c++代码
两者都可以,但是请注意:
1,后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序;后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的。
C++的语法规则更加严谨一些。
2,编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通常用g++来完成链接,为了统一起见,干脆编译/链接统统用g++了,这就给人一种错觉,好像cpp程序只能用g++似的。
误区二:
gcc不会定义__cplusplus宏,而g++会
实际上,这个宏只是标志着编译器将会把代码按C还是C++语法来解释,如上所述,如果后缀为.c,并且采用gcc编译器,则该宏就是未定义的,否则,就是已定义。
误区三:
编译只能用gcc,链接只能用g++
严格来说,这句话不算错误,但是它混淆了概念,应该这样说:
编译可以用gcc/g++,而链接可以用g++或者gcc-lstdc++。
因为gcc命令不能自动和C++程序使用的库联接,所以通常使用g++来完成联接。
但在编译阶段,g++会自动调用gcc,二者等价。
请问CCccgccg++本质区别在什么地方?
传统上,UNIXOS会配带Ccompilerbydefault.一般用符号名cc.而C++compiler需要另外买.
常见的有:
Linux:
gcc/g++
Solaris:
cc/CC
HP-UX:
aCC
AIX:
xlc/xlC
SCO:
?
/?
几乎所有的情况,C/C++compiler都只是frontenddriver.后面的编译器是一样的.比如gcc,g++提供不同的选项给编译器以及linkeditor.这些包括用户选项,缺省选项,对应的缺省系统库.每个compiler有一个configuratoinfile来指定这些缺省选项.使用verbosemode(-v)可以看到这些内容.
C++程序因为语法(namespace,class,overload...),需要mangle所有的symbolname.与C程序link的时候需要用extern"C".
C++的编译器肯定可以编译C的的代码,注意除了C++对C的语法扩充之外,编译和链接C和C++的标准库通常也不一样呢。
我用gcc而非g++也编译了C++的程序就证明了这一点。
【来源】
矩形相交
TimeLimit:
1000MSMemoryLimit:
30000KB
TotalSubmit:
139Accepted:
49
Description
给定平面上2个边平行于坐标轴矩形,判断他们是否相交,即两个矩形公共面积>0(只重合了某部分边公共面积为0).
Input
输入有多个case,每个case有8个整数,x11y11x12y12x21y21x22y22,分别是第一个矩形的左上角坐标,右下角坐标,第二个矩形的左上角坐标,右下角坐标.
Output
对于每个case,输出yes,如果两个矩形相交,否则输出no
SampleInput
02201441
SampleOutput
yes
Source
EOJ
[Submit][States][Discuss]
难得有跟1000题差不多水的题:
#include
usingnamespacestd;
intx11,y11,x12,y12,x21,y21,x22,y22;
intmain()
{
while(scanf("%d%d%d%d%d%d%d%d",&x11,&y11,&x12,&y12,&x21,&y21,&x22,&y22)==8)
{
if(y12>=y21||y22>=y11||x12<=x21||x22<=x11)printf("no\n");
elseprintf("yes\n");
}
}
PolygonDivision
TimeLimit:
2000MS
MemoryLimit:
131072K
TotalSubmissions:
609
Accepted:
306
Description
Givenaregularpolygon,therearenumerouswaystodivideitintoseveraltrianglesand/orquadranglesbyaddingsomediagonalsthatdonotproperlyintersecteachother.Forexample,Figure4showsalltendifferentdivisionsofaregularpentagonintotrianglesandquadrangles.
Figure4:
Divisionsofaregularpentagonintotrianglesandquadrangles
Givenn,thenumberofsidesofthepolygon,computethenumberofsuchdivisions.
Input
Theinputcontainsmultipletestcases.Eachtestcaseconsistsofasingleintegern(3≤n≤5000)onaseparateline.TheinputendswhereEOFismet.
Output
Foreachtestcase,printtheanswermodulo264onaseparateline.
SampleInput
3
4
5
6
7
8
9
10
SampleOutput
1
3
10
38
154
654
2871
12925
Source
PKUCampus2008(POJFounderMonthlyContest–2008.05.10),frkstyc
[Submit] [GoBack] [Status] [Discuss]
本题代码参考:
牛虻之木有情
#include
#include
#include
usingnamespacestd;
unsigned__int64u[5005];
unsigned__int64t[5005];
intmain()
{
intn;
u[0]=u[1]=u[2]=1;
t[0]=t[1]=t[2]=1;
for(inti=3;i<=5000;i++){
u[i]=0;
for(intj=2;j<=i-1;j++)
{
u[i]+=t[j]*t[i-j+1];
}
t[i]=u[i];
for(intj=2;j<=i-2;j++)
{
t[i]+=t[j]*u[i-j+1];
}
}
while(scanf("%d",&n)!
=EOF){
cout< }
return0;
}
分析(参考解题报告):
如果分出的全为三角形的话,那就是正多边形三角剖分问题。
它的结果就是Catalan数。
现在也可以划分出四边形的话,可以采用动态规划策略。
具体如下:
将n边形的顶点按顺时针或逆时针编号为1,2,3....n(n>=3),设T(n)为最终的结果,E(i,j)为i号顶点和j号顶点连成的对角线(1<=i(2)=1.分两种情况讨论:
(1)边E(1,n)为划分后一个三角形的一条边。
i为该三角形的另外一个顶点(2<=i<=n-1),因此,对角线E(1,i)和对角线E(i,n)将n边形分为1个i边形,1个由顶点(1,i,n)组成的三角形,1个(n-i+1)边形;这种情况下,问题规模缩小为小i边形,和(n-i+1)边形的。
此时的种数为:
a=∑T(i)*T(n-i+1) (2<=i<=n-1)
(2)边E(1,n)为划分后一个四边形的一条边。
i,j为该四边形的另外两个顶点(2<=i<=n-2,i+1<=j<=n-1)。
1,n,i,j四个顶点将n边形分为1个i边形,1个j-i+1边形,1个n-j+1边形和该四边形。
我们可以继续将i边形,j-i+1,n-j+1边形继续划分,规模也将继续缩小。
此时的种数为:
b=∑∑T(i)*T(j-i+1)*T(n-j+1);(2<=i<=n-2,i+1<=j<=n-1)
故T(n)=a+b=∑T(i)*T(n-i+1)+∑∑T(i)*T(j-i+1)*T(n-j+1);
此时的时间复杂度为O(n^3),会TLE,我们可以将上述表达式写成以下形式以降低时间复杂度
U(n)=∑T(i)*T(n-i+1);(2<=i<=n-1)
T(n)=U(n)+∑T(i)*U(n-i+1);(2<=i<=n-2)
学编程决不可心浮气燥任何实践都是……
我认为有些人的观点错了。
错得一塌糊涂。
对于这个问题,我的基本观点是:
任何实践都是理论的载体或表现形式。
而理论也是由实践上升而来的。
两者是辨证的。
今天,我们只关注它的前一部分:
任何实践都是理论的载体和表现形式。
我不是想故弄玄虚,但真理的外表看上去往往就是这么奇形怪状、难以理解。
让我来给你解释一下吧。
比如:
战争是军事理论的实践,也是它的表现形式。
战争的胜负取决于指挥者军事理论的掌握程度(别给我举赵括这类“纸上谈兵”的反例,他们根本算不上掌握了军事理论,充其量只算是“背”下了军事理论。
“掌握”和“倒背如流”这是两个概念。
)
1、VC、VB、Delphi……,你该学哪个?
具体到编程而言,我要告诉你:
任何一种计算机语言,都是计算机科学理论的载体或表现形式。
C++很神吗?
Java很酷吗?
它们差距很远吗?
是的。
但从理论的层面上讲,它们没有区别,都是“面向对象”理论的一个具体形式而已。
现在的程序员们被发行编译软件(通常我们将其称为“系统软件”)的商家不断推出的产品搞得眼花缭乱,头痛欲裂。
不断地跟在新语言后面跑,这条路还没跑到头,那边的“新路”又鸣锣开张了,于是再跟着跑……渐渐地有些人开始感叹:
学海无涯、学无止境,或什么“程序员是青春饭,过了三十别想干”……
在此我不得不叹息:
中国的教育真是一种“形而上学”的教育。
早在高中时代我们就学过“辨证唯物主义”的基本理论:
做事情要抓主要矛盾。
这一条恐怕谁都知道,却鲜见谁能在实践中把这一理论运用得“炉火纯青”的。
把这一理论运用到编程上来讲就是:
理论是主要矛盾,语言是次要矛盾,学会了理论,再具体到学一种语言时,你只不过是在进行某种消遣而已。
现在学VC的普遍看不起学VB的或学Delphi的。
但如果一个用Delphi的人,在需要写web程序时,用TCP/IP做了一个构架,嵌入到应用程序中;而另一个用VC的人却只会把一个又一个的组件拖来拉去的做些个“例子程序”的翻版。
你说他们两个谁历害?
Delphi和VC谁历害?
真应了这样一段话,问:
纽约好还是上海好?
答:
有钱哪儿都好,没钱哪儿都不好。
上海的富人并不比纽约的富人少多少的优越感,而纽约的乞丐也不比上海的乞丐多多少幸福感。
现在你还会说学VC的人就一定比学Delphi的人水平高、“钱景”好吗?
2、“浅薄”绝不该是中国程序员的性格特征!
!
!
想问一句:
中国程序员这么多,你们真地把基础理论学好了吗?
别用你现有的编程经历告诉我:
编程不需要数学,不需要数据结构,不需要编译原理…………说话得负责任,您知道吗?
我之所以发表这篇文章,就是因为再也看不下去这种在中国编程界漫延的歪理邪说了!
邪教害死的是人的个体,你们害死的是中国软件业的未来!
如果再让这种理论继续毒害编程新手的思想,中国将在计算机领域失去民族的尊严!
!
!
请问,操作系统、编译软件、数据库系统……这些被称为“系统软件”的东东,中国有几样拿得出手的产品?
也许是我孤陋寡闻,据我所知:
我们国家一件像样的也没有。
不错,我们是有一些网站的股票在西方上市了,我们是有一些人被国外公司请去做高级职员了,我们也有一些人把西方的官方网站给黑了……但是,我们用的编译工具是谁的产品?
我们微机里装得是谁做出的操作系统?
我们的程序跑在谁的芯片上?
爱之深,恨之切。
我爱的是中国,但我痛恨不是中国,而是在中国编程界普遍流行的“浅薄”和“自以为是”,这是我们民族软件业的一颗毒瘤!
是的,现在编程方面快速入门的书满天飞,让程序员的门槛越来越低。
我这个外行就得益于这个“低门槛”,跑了进来。
但进来后,我们就不能再这样浅薄下去了——我的兄弟们!
用他国提供的工具做几个网站,写几个应用程序,弄出几个病毒……是振兴不了民族软件业的。
顺便说一句:
我尊敬求伯君,但我不认为金山公司和其系列产品配得上被称为“民族软件业”的大旗,相对这个称号,它差得太远