JZOJ2017.08.05 C组

来源:互联网 发布:java执行sql语句 编辑:程序博客网 时间:2024/06/07 00:26

T1

题目描述

假如说一场比赛包含8道不同分值的题目,每位选手可以自己选择所要做的题目。但是,他们的最后总得分是其中得分最高的5个题目的分数之和。现在给出某位选手每道题目的得分,请算出这位选手的最后总得分,同时列出得分最高的5个题目的序号,序号按照从小到大排列。

思路:排序,水题一道。。。。。。

代码:

var a,b:array[-1..11] of longint;    i,j:longint;begin  assign(input,'najboljih5.in');  assign(output,'najboljih5.out');  reset(input);  rewrite(output);  for i:=1 to 8 do begin read(a[i]);  b[i]:=i; end;  for i:=1 to 7 do    for j:=i+1 to 8 do      if a[i]<a[j] then      begin        a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];        b[0]:=b[i]; b[i]:=b[j]; b[j]:=b[0];      end;  for i:=1 to 4 do    for j:=i+1 to 5 do      if b[i]>b[j] then      begin        //a[0]:=a[i]; a[i]:=a[j]; a[j]:=a[0];        b[0]:=b[i]; b[i]:=b[j]; b[j]:=b[0];      end;  write(a[1]+a[2]+a[3]+a[4]+a[5]);  writeln;  for i:=1 to 5 do write(b[i],' ');  close(input);  close(output);end.

T2

题目描述

Mirko 刚开始学车,因此他还不会在一个很狭窄的地方掉头,所以他想找一个不需要掉头的地方学车。Mirko马上发现他想找的地方必须没有死胡同,因为死胡同是不可能出来的,除非掉头(假设Mirko也不会倒车)。现在,你需要写一个程序,来分析一个地方的地图,研究是否这个地方适合Mirko练习开车。这张地图是包含R*C个单元格的,单元格中的“X”代表一个建筑物,单元格中的“.”代表路面。从一个路面单元格,Mirko可以向旁边上下左右四个方向的单元格开去,只要开过去的地方同样也是路面。最后,我们要得出这个地图是否包含死胡同,假如从任意一个路面单元格出发,沿着任何一个可以行驶的方向,我们可以不用掉头就能返回到出发点,那么这个地图就是没有死胡同的。

思路:

一开始的思路是dfs,结果只得了90。其实有更简单的方法,判断空地上下左右有多少'x',<=2则不是死胡同 

代码:

var a:array[0..11,0..11] of char;    n,m,i,j,t:longint;procedure quit;begin  close(input);  close(output);  halt;end;begin  assign(input,'okret.in');  assign(output,'okret.out');  reset(input);  rewrite(output);  readln(n,m);  for i:=1 to n do begin for j:=1 to m do read(a[i,j]); readln; end;  for i:=1 to n do    for j:=1 to m do      if(a[i,j]='.') then      begin        t:=0;        if a[i+1,j]<>'.' then inc(t);        if a[i-1,j]<>'.' then inc(t);        if a[i,j+1]<>'.' then inc(t);        if a[i,j-1]<>'.' then inc(t);        if t>2 then begin write(1); quit; end;      end;  write(0);  quit;end.

T3

题目描述

Mirko最近收到了一个家庭作业,作业的任务是计算两个数A和B的最大公约数。由于这两个数太大了,我们给出了N个数,他们的乘积是A,给出M个数,他们的乘积是B。Mirko想要验算自己的答案,所以他想找你写一个程序来解决这个问题。如果这个最大公约数超过了9位数,那么只需要输出最后9位就可以了。

思路:

1.分解质因数可是x<=1000000000,会爆。。。。。。2.两两求质因数,再相乘可是不知为啥我只有20分 

T4

题目描述

在顺利完成家庭作业以后,Mirko感到非常的厌倦。所以,他列出了N个数,这些数中有些数对他是喜欢的,有些数对他是不喜欢的。他喜欢的数对叫做友好数对,如果两个数至少有一个相同的数字(不要求在相同的位置),那么这两个数就是友好数对。请帮助Mirko在这N个数找出有多少友好数对。

思路:

容斥原理先把数拆分,用二进制表示再用容斥原理求解 

代码:

var ans:int64;   // a:array[0..11] of longint;    b:array[0..10000] of longint;procedure init;var i,n,t,s,j,k:longint;    x:int64;begin  assign(input,'kompici.in');  assign(output,'kompici.out');  reset(input);  rewrite(output);  read(n);  for i:=1 to n do  begin    s:=0;    t:=0;    //fillchar(a,sizeof(a) ,0);    read(x);    while x>0 do    begin      t:=x mod 10;      x:=x div 10;      s:=s or (1 shl t);    end;    inc(b[s]);  end;end;procedure rc;var i,j:longint;begin  for i:=1 to 1023 do  begin    if b[i]=0 then continue;    for j:=1 to 1023 do    begin      if (i and j=0)or(b[j]=0)or(i=j) then continue;      ans:=ans+b[i]*b[j];    end;    ans:=ans+b[i]*(b[i]-1);  end;  ans:=ans div 2;end;begin  init;  rc;  write(ans);  close(input);  close(output);end.