a[j,k]:
=a[j,i]+a[i,k];
a[k,j]:
=a[j,k];
end;
writeln(a[1,n+2]);
end.
【培训试题】集合操作
TimeLimit:
10000MS MemoryLimit:
65536K
TotalSubmit:
148Accepted:
68
CaseTimeLimit:
1000MS
Description
常用的集合运算有并、交、差、补,现在给定两个集合A和B,它们都是自然数集的子集,且集合中每个元素的范围是:
[-maxint,maxint],全集I定义为integer范围内的所有整数。
你的任务是:
求出集合A和B的并、交、差。
Input
两行:
第一行第一个整数n,表示集合A的元素个数,接下来的n个整数表示集合A的元素;
第二行第一个整数m,表示集合B的元素个数,接下来的m个整数表示集合B的元素;
Output
三行:
第一行若干整数,表示A和B的交集;
第二行若干整数,表示A和B的并集;
第三行若干整数,表示A和B的差集;
注意:
为了便于测试,集合元素输出由小到到大排列,如果是空集,则输出‘nil’。
SampleInput
3246
510492
SampleOutput
24
012469
6
Hint
0≤n,m≤10,000
Source
xinyue
var
i,j,n:
integer;
a,b:
array[-maxint..maxint]ofboolean;
begin
read(n);
fori:
=1tondobegin
read(j);a[j]:
=true;
end;
read(n);
fori:
=1tondobegin
read(j);b[j]:
=true;
end;
j:
=0;
fori:
=-maxinttomaxintdo
ifa[i]andb[i]thenbegin
inc(j);write(i,'');
end;
ifj=0thenwrite('nil');writeln;j:
=0;
fori:
=-maxinttomaxintdo
ifa[i]orb[i]thenbegin
inc(j);write(i,'');
end;
ifj=0thenwrite('nil');writeln;j:
=0;
fori:
=-maxinttomaxintdo
ifa[i]andnotb[i]thenbegin
inc(j);write(i,'');
end;
ifj=0thenwrite('nil');writeln;
end.
【模拟试题】光光的作业
TimeLimit:
10000MS MemoryLimit:
65536K
TotalSubmit:
443Accepted:
33
CaseTimeLimit:
1000MS
Description
光光上了高中,科目增多了。
在长假里,光光的老师们都非常严厉,都给他布置了一定量的作业。
假期里,光光一共有的时间是k小时。
在长假前,老师们一共给光光布置了n份作业,第i份作业需要的时间是ti小时。
但是由于老师们互相不商量,因此光光有可能不能完成老师的作业。
当可能不能完成老师的作业时,光光就事后去向老师说明,然后被老师批评一顿了事。
对于一件作业,只有2种情况:
完成或者不完成(快要完成也算不完成)。
如果没完成,受到批评是天经地义的。
但是,不同的作业对于光光来说,批评的力度是不同的。
第i件作业如果没完成,就要受到pi个单位的批评。
多次这样之后,光光想要在长假前就知道他至少会受到多少个单位的批评。
你能帮助他吗?
Input
第一行只有一个数字k。
第二行只有一个数字n。
接下来n行,每行两个数字,分别是ti和pi,两个数字之间用一个空格分开。
Output
仅包含一行,是一个数字,代表了光光最少受到的批评。
SampleInput
5
3
26
13
47
SampleOutput
6
Hint
[数据规模约定]
100%的数据中,k<=100000,ti<=10000,pi<=10000;
30%的数据中,n<=20;
100%的数据中,n<=500。
Source
xinyue
var
i,j,k,n,ma,max:
longint;
a:
array[0..100000]oflongint;
t:
array[1..500]oflongint;
p:
array[1..500]oflongint;
begin
readln(k);readln(n);
fori:
=1tondoreadln(t[i],p[i]);
fori:
=1tokdoa[i]:
=5000001;a[0]:
=0;
ma:
=0;
fori:
=1tondoma:
=ma+p[i];
fori:
=1tondo
forj:
=k-t[i]downto0do
if((a[j+t[i]](a[j+t[i]]>5000000))and(a[j]<5000000)then
a[j+t[i]]:
=a[j]+p[i];
max:
=0;
fori:
=1tokdoif(max=a[i];
writeln(ma-max);
end.
【基础试题】最短路径问题(normal)
TimeLimit:
10000MS MemoryLimit:
65536K
TotalSubmit:
708Accepted:
273
Description
平面上有n个点(n<=100),每个点的坐标均在-10000到10000之间.其中的一些点之间有连线.若有连线,则表示可从一个点到达另一个点,即两点间有通路,通路的距离为两点间的直线距离.现在的任务是找出从一点到另一点之间的最短路径.
Input
共n+m+3行
第一行为整数n.
第2行到第n+1行,每行两个整数x和y,描述了一个点的坐标(以一个空格分开)
第n+2行为一个整数m,表示图中连线的个数.
以后的m行,每行描述一条连线,由两个整数i和j组成,表示第i个点和第j个点之间有连线.
最后一行;两个整数s和t,分别表示源点和目标点.
Output
仅一行,一个实数(保留两位小数),表示从s到t的最短路径长度
SampleInput
5
00
20
22
02
31
5
12
13
14
25
35
15
SampleOutput
3.41
Source
xinyue
var
i,j,k,n,m,x,y,h,t:
longint;
min:
real;
a:
array[1..100,0..100]ofreal;
b:
array[1..100,1.