2017年东莞市信息学特长生测试题 优美景点
Time Limit:10000MS Memory Limit:25600K
Total Submit:13 Accepted:12
Case Time Limit:1000MS
Description
D城市是个有深厚文化底蕴的城市,有许多优美的景点,今年政府组织了市民对该城市的N个优美的景点进行了投票,政府部门想知道这N个景点投票数从大到小的情况,现在请你对给定的投票数按从大到小排序输出来。
Input
文件共有N+1行,第一行为一个正整数N,表示共有N个景点(1=
Output
共有N行,每行一个正整数,输出按投票数值从大到小排好序的结果。
Sample Input
5
90
105
87
65
98
Sample Output
105
98
90
87
65
var
a:array[0..501]of longint;
i,j,t,n:longint;
begin
for i:=1 to n do readln(a[i]);
read(n);for i:=1 to n do
for j:=i to n dot:=a[j];a[j]:=a[i];
for i:=1 to n-1 do writeln(a[i]);
a[i]:=t;end;write(a[n]);
end.
2017年东莞市信息学特长生测试题 益智游戏
Time Limit:10000MS Memory Limit:25600KTotal Submit:43 Accepted:15 Case Time Limit:1000MS
Description
李老师最近开发了一项关于训练学生心算能力的益智游戏,游戏很简单,就是随机给定4个1到9之间的自然数,要求判断能否对这4个自然数进行适当的算术运算,使运算结果等于24。 你可以使用的运算只有:+,-,*,/,您还可以使用()来改变运算顺序。注意:所有的中间结果须是整数,所以一些除法运算是不允许的(例如,(2*2)/4是合法的,2*(2/4)是不合法的)。下面我们给出一个游戏的具体例子: 若给出的4个自然数是:1、2、3、7,则一种可能的解答是1+2+3*7=24。计算过程: 2+1=3 7*3=21 21+3=24 不要求输出具体计算过程,现在请你编写实现这个游戏加强版的程序(所谓加强版,就是要对多组数据逐一进行判断,具体输入输出及要求如下)。
Input
共有N+1行,第一行只有一个正整数N,表示要判断数据共有N组(1=< N <=10),接下来N行,每行有4个1到9之间的自然数(数据与数据之间用空格隔开)。
Output
共有N行,第K行对应于第K组4个1到9之间的自然数是否能用适当的算术运算使运算结果等于24,如果能,则输出1,如果不能则输出0。
Sample Input
2
1 2 3 7
1 1 1 1
Sample Output
1
0
思路:全排列4个数所有结果,然后把运算结果加减乘除一波。
var
a:array[0..5]of longint;
b:array[0..5]of boolean;
ans:boolean;
i,j,n,q:longint;
procedure dfs(rp,deep:longint);
var
i:longint;
begin
if ans then exit;
if deep>=4 then begin
if rp=24 then ans:=true
else ans:=false;
exit;
end;
for i:=1 to 4 do
if b[i] then
begin
b[i]:=false;
dfs(rp-a[i],deep+1);
dfs(a[i]-rp,deep+1);
dfs(rp+a[i],deep+1);
dfs(rp*a[i],deep+1);
if rp mod a[i]=0 then dfs(rp div a[i],deep+1);
b[i]:=true;
end;
end;
begin
read(q);
for i:=1 to q do
begin
for j:=1 to 4 do begin
read(a[j]);
b[j]:=true;
end;
ans:=false;
for j:=1 to 4 do
begin
b[j]:=false;
dfs(a[j],1);
b[j]:=true;
end;
if ans then writeln('1')
else writeln('0');
end;
end.
2017年东莞市信息学特长生测试题 工程
Time Limit:10000MS Memory Limit:256000K
Total Submit:18 Accepted:13
Case Time Limit:1000MS
Description
张三是某工程公司的项目工程师。一天公司接下一项大型工程,该公司在大型工程的施工前,先要把整个工程划分为若干个子工程,并把这些子工程编号为1、2、…、N;这样划分之后,子工程之间就会有一些依赖关系,即一些子工程必须在某些子工程完成之后才能施工,公司需要工程师张三计算整个工程最少的完成时间。
对于上面问题,可以假设:
1、根据预算,每一个子工程都有一个完成时间。
2、子工程之间的依赖关系是:部分子工程必须在一些子工程完成之后才开工。
3、只要满足子工程间的依赖关系,在任何时刻可以有任何多个子工程同时在施工,也即同时施工的子工程个数不受限制。
例如:有五个子工程的工程规划表:
现在对于给定的子工程规划情况,及每个子工程完成所需的时间,如果子工程划分合理则求出完成整个工程最少要用的时间,如果子工程划分不合理,则输出-1。
Input
第1行为正整数N,表示子工程的个数(N<=200)
第2行为N个正整数,分别代表子工程1、2、…、N的完成时间。
第3行到N+2行,每行有N-1个0或1,其中的第K+2行的这些0或1,分别表示“子工程K”与子工程1、2、…、K-1、K+1、…、N的依赖关系(K=1、2、…、N)。每行数据之间均用空格分开。
Output
如果子工程划分合理则输出完成整个工程最少要用的时间,如果子工程划分不合理,则输出-1。
Sample Input
project.in
5
5 4 12 7 2
0 0 0 0
0 0 0 0
0 0 0 0
1 1 0 0
1 1 1 1.
project.in
5
5 4 12 7 2
0 1 0 0
0 0 0 0
0 0 1 0
1 1 0 0
1 1 1 1
Sample Output
project.out
14
project.out
-1
思路:每次搜索一下自己的工作能不能做,顺便覆盖最大时间。
const
maxn=233333333;
var
check:boolean;
f:array[0..1000,0..1000]of longint;
a,t,c:array[0..1000]of longint;
i,j,k,n,m,l,ans:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
procedure dfs(deep:longint);
var
i,ank:longint;
begin
ank:=0;
if not check then exit;
if c[deep]>=2 then begin
check:=false;
exit;
end;
for i:=1 to n do
if f[deep,i]=1 then begin
if a[i]=maxn then
inc(c[i]);
dfs(i);
dec(c[i]);
if a[i]<>maxn then
ank:=max(ank,a[i]);
end;
a[deep]:=ank+t[deep];
end;
begin
read(n);
for i:=1 to n do read(t[i]);
for i:=1 to n do
begin
for j:=1 to n do
if i<>J then read(f[i,j]);
a[i]:=maxn;
end;
check:=true;
for i:=1 to n do
begin
if a[i]=maxn then
begin
check:=true;
c[i]:=1;
dfs(i);
if not check then break;
c[i]:=0;
if a[i]<>maxn then ans:=max(ans,a[i]);
end;
end;
if not check then write('-1')
else write(ans);
end.
2017年东莞市信息学特长生测试题 摆渡线路
Time Limit:10000MS Memory Limit:256000KTotal Submit:5 Accepted:3 Case Time Limit:1000MS
Description
某市的M公园中有一个近乎圆形的湖,有100个主要景点分布在湖边,为了方便游客,公园在一些景点之间开设了直通的摩托飞艇摆渡的项目一来减少游客在景点到景点之间所花的时间,二来也可以让游客体验一下惊险刺激的摩托飞艇。果然摩托飞艇摆渡项目大为成功,为了充分满足游客需要,摆渡线路越来越多。不料随着线路的增加,危险性也随之增加。如果两个摆渡线路之间有交叉(如上图),在这两个线路上的飞艇一旦发生碰撞,后果将不堪设想。 公园的管理层近日做出决定,本着安全第一的原则,在这个湖上取消一些线路,使剩下的任意两条线路在行驶阶段(即不考虑码头)不交叉。同时,考虑到经济效益,他们要求被取消的线路数最小,即保留尽量多的线路。他们希望你能够帮助他们算一算最多可以保留多少条线路。
Input
从文件line.in中读入数据,文件的第一行为N(1=
Output
将结果输出到文件line.out,文件只有一行,只有一个数,就是保留下来的线路的最多条数。
Sample Input
5
91 31
1 45
27 5
11 65
43 72
Sample Output
3
思路:around就是圆周的长,根据题意=100,要保证l,i,j,k都不不会超过圆周的长,就需要mod around,由于是一个枚举所有节点的过程,所以+1。对于每条边,删和不删之间有一个最优解,即 (f[i,k]+f[k,j]+v[i,j]) or (f[i,j]+0)。其中+1表示不删边,+0删。
const
around=100;
var
f,v:array[0..101,0..101]of longint;
i,j,n,x,y,ans,k,l:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a);
exit(b);
end;
begin
read(n);
for i:=1 to n do
begin
read(x,y);
v[x,y]:=1;
v[y,x]:=1;
end;
for l:=1 to around do
for i:=1 to around do
begin
j:=(l+i-1)mod around+1;
k:=i;
while(k<>j)do
begin
f[i,j]:=max(f[i,j],f[i,k]+f[k,j]+v[i,j]);
k:=k mod around+1;
end;
ans:=max(ans,f[i,j]);
end;
write(ans);
end.