zoukankan      html  css  js  c++  java
  • jzoj C组 2017.1.14 比赛

    今天的比赛 100(枚举)+40(快排+暴力)+100(广搜)+30(暴力)=270

    第一题

    题目描述

    小x想要申请英国剑桥大学,他准备了很长时间,在临走的一天,意外得知初审没有过,拒绝的理由竟然是体重!!!
       小x很沮丧,于是,他做出了一个“丧心病狂”的决定:对他的单词书里包含“CAMBRIDGE”中任意一个字母的单词进行修改。具体方法是这样的:对于每个单词,删掉其中出现在“CAMBRIDGE”中的字母。
    

    输入

    有且仅有一行,包含一个有大写英文字母组成的单词(长度:3~100)。
    

    输出

    有且仅有一行,包含一个修改过的单词。

    样例输入

    LOVE

    样例输出

    LOV

    数据范围限制

    单词(长度:3~100)。


    不用想暴力过


    代码如下:

    var    x,y:string;
           a:array['A'..'Z']of boolean;
           i:longint;
    begin
      assign(input,'un.in');
      assign(output,'un.out');
      reset(input);;
      rewrite(output);
      readln(x);
      y:='CAMBRIDGE';
      fillchar(a,sizeof(a),true);
      for i:=1 to length(y) do a[y[i]]:=false;
      x:=upcase(x);
      for i:=1 to length(x) do
        if a[x[i]]=true then write(x[i]);
      close(input);
      close(output);
    end.

    第二题

    题目描述

        小x为了平复自己悲愤的心情,参加了F7赛车决赛的解说工作。作为一位优秀的主持人,他想要了解一下参加决赛的N位选手的情况。经过一番努力,他找到了各位选手前几站比赛的成绩。
    
        决赛就要开始了,比赛规定:第一个到达终点的得到N分,第二个到达终点的得到N-1分,以此类推„„最后一个到达终点的得到1分。而且不会有两位选手同时到达终点。小x非常忙,所以他想请你帮他统计一下有多少选手有可能成为总冠军(之前的成绩+决赛成绩=总成绩,总成绩最高者为总冠军,总冠军可能有多位)。
    

    输入

    第一行一个正整数N(3 ≤ N ≤ 300 000),代表参加决赛的选手个数。

    接下来N行,每行一个正整数Bi,代表第i位选手之前比赛的成绩。

    输出

    只有一行包含一个正整数,代表有可能成为总冠军的选手个数。

    样例输入

    Input1:

    3
    8
    10
    9

    Input2:

    5
    15
    14
    15
    12
    14

    样例输出

    Output1:

    3

    Output2:

    4

    数据范围限制

    3 ≤ N ≤ 300 000


    先快排,再枚举如果i为第一,其他都是最坏的情况,能不能取得冠军。
    

    代码如下:

    var   x:array[0..300000]of longint;
          m,n,i,j,k:longint;
          bool:boolean;
    
    procedure qsort(l,r:longint);
    var  i,j,mid:longint;
    begin
      if l>r then exit;
      i:=l; j:=r;
      mid:=x[(l+r) div 2];
      repeat
        while x[i]>mid do inc(i);
        while x[j]<mid do dec(j);
        if i<=j then
          begin
            x[0]:=x[i]; x[i]:=x[j]; x[j]:=x[0];
            inc(i); dec(j);
          end;
      until i>j;
      qsort(l,j);
      qsort(i,r);
    end;
    
    begin
      assign(input,'f7.in');
      assign(output,'f7.out');
      reset(input);
      rewrite(output);
      readln(n);
      for i:=1 to n do readln(x[i]);
      qsort(1,n);
      m:=n;
      for i:=n downto 1 do
        begin
          if x[i]=x[i+1] then
            begin
              if bool=false then dec(m);
              continue;
            end;
          k:=1;
          bool:=true;
          for j:=1 to n do
            if i<>j then
              begin
                if x[j]+k>x[i]+n then
                  begin
                    dec(m);
                    bool:=false;
                    break;
                  end
                else inc(k);
              end;
          if bool=true then break;
        end;
      write(m);
      close(input);
      close(output);
    end.

    第三题

    题目描述

     话说小x神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,小x身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。
     根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到小x,组织把这个光荣而艰巨的任务便交给了你。编写程序,通过使用一张地图帮助研究所确定从研究所出发找到小x的最短距离。
    

    输入
    第一行为n(n<=1000)。
    第二行为n*n的地图(其中0表示通路,1表示死路)。
    最后两行每行有两个数字,分别表示研究所的坐标和小x信号所在的位置。

    输出
    一行一个数字k,表示从研究所出发找到小x的最短距离。

    样例输入
    10
    0100110100
    0001110010
    1000000001
    1000100011
    0000101100
    1000001100
    1001010011
    0000010100
    0101010000
    1001000001
    1 7
    10 2

    样例输出
    14

    数据范围限制
    (n<=1000)


    直接码广搜过


    代码如下:

    const dx:array[1..4]of longint=(1,-1,0,0);
          dy:array[1..4]of longint=(0,0,1,-1);
    
    var  a:array[-1..2000,-1..2000]of char;
         n,b1,b2,e1,e2,l,tail:longint;
         state:array[1..1000000,1..2]of longint;
         father:array[1..2000000]of longint;
    
    procedure init;
    var i,j:longint;
    begin
      readln(n);
      for i:=1 to n do
        begin
          for j:=1 to n do read(a[i,j]);
          readln;
        end;
      readln(b1,b2);
      readln(e1,e2);
    end;
    
    function check(x,y:longint):boolean;
    begin
      check:=true;
      if a[x,y]='1' then check:=false;
      if (x>n)or(y>n)or(y<1)or(x<1) then check:=false;
    end;
    
    procedure print(x:longint);
    begin
      if x=0 then exit;
      inc(l);
      print(father[x]);
    end;
    
    procedure bfs;
    var head,i:longint;
    begin
      head:=0; tail:=1; state[1,1]:=b1; state[1,2]:=b2; a[b1,b2]:='1';
      father[1]:=0;
      repeat
        inc(head);
        for i:=1 to 4 do
          if check(state[head,1]+dx[i],state[head,2]+dy[i]) then
            begin
              inc(tail);
              father[tail]:=head;
              state[tail,1]:=state[head,1]+dx[i];
              state[tail,2]:=state[head,2]+dy[i];
              a[state[tail,1],state[tail,2]]:='1';
              if (state[tail,1]=e1)and(state[tail,2]=e2) then
                begin
                  print(father[tail]);
                  tail:=0;
                  writeln(l);
                  halt;
                end;
            end;
      until head>=tail;
    end;
    
    begin
      assign(input,'findn.in');
      assign(output,'findn.out');
      reset(input);
      rewrite(output);
      init;
      bfs;
      close(input);
      close(output);
    end.

    第四题

    题目描述
    小x的好朋友小y给他出了一道难题,他想让小x在一个矩阵中找到一个子矩阵,使它的和最大。小x希望你能帮他解决这个问题。

    输入
    第一行一个正整数N,M。
    以下N行,每行M个整数。

    输出
    有且仅有一行,包含一个数,表示所求的最大的和。
    保证结果在longint范围内。

    样例输入
    3 3
    2 -1 1
    -3 2 -2
    0 1 1

    样例输出
    3

    数据范围限制
    【数据范围】
    对于30%的数据:1<=N,M<=50
    对于60%的数据:1<=N,M<=100
    对于100%的数据:1<=N,M<=500


    将每一段的值求出来,再枚举每一种情况。


    代码如下:

    var   n,m,i,j,k,max,ans,min:longint;
          a,b:array[0..501,0..501]of longint;
    begin
      assign(input,'mpro.in');
      assign(output,'mpro.out');
      reset(input);
      rewrite(output);
      readln(n,m);
      for i:=1 to n do
        begin
          for j:=1 to m do
            begin
              read(a[i,j]);
              b[i,j]:=a[i,j]+b[i-1,j]+b[i,j-1]-b[i-1,j-1];
            end;
          readln;
        end;
      ans:=0;
      for i:=0 to n-1 do
        for j:=i+1 to n do
          begin
            min:=0;
            max:=0;
            for k:=1 to m do
              begin
                max:=b[j,k]-b[i,k]-min;
                if max>ans then ans:=max;
                if b[j,k]-b[i,k]<min then min:=b[j,k]-b[i,k];
              end;
          end;
      write(ans);
      close(input);
      close(output);
    end.
    
  • 相关阅读:
    python调用c++动态库报错
    Python自动化测试常用库整理
    Linux kswapd0 进程CPU占用过高快速处理方法
    Linux安装jdk8及环境变量配置
    免费的网站安全检查和恶意软件扫描程序
    【Java】对象的创建、初始化和使用
    【Java】数组的创建、遍历和复制
    【Java】Java 语言中流程控制语句(分支语句、循环语句、转移语句)的一些新特性
    【Java】Java 语言中操作符的一些新特性
    【Java】常量与变量(局部变量、成员变量)
  • 原文地址:https://www.cnblogs.com/Comfortable/p/8412449.html
Copyright © 2011-2022 走看看