JZOJ2017.08.05 C组

59 篇文章 0 订阅

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.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值