2017年东莞市信息学特长生测试题

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=<n<=500),接下来有n行,每行一个正整数ai表示一个景点的投票值(1=<ai<=3000)。< font="">

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
if a[i]<a[j]then begin
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=<n<=10000),表示现有的线路数。接下来的n行,每行有两个1至100的数a,b,表示a至b之间有飞艇往返。显然a不会等于b,且若a至b有线路,则b至a也必有线路,它们不会同时出现在输入文件中。< font="">

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.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值