jzoj C組 2017.1.14 比賽

今天的比賽 100(枚舉)+40(快排+暴力)+100(廣搜)+30(暴力)=270markdown

第一題

題目描述spa

小x想要申請英國劍橋大學,他準備了很長時間,在臨走的一天,意外得知初審沒有過,拒絕的理由居然是體重!!!
   小x很沮喪,因而,他作出了一個「喪心病狂」的決定:對他的單詞書裏包含「CAMBRIDGE」中任意一個字母的單詞進行修改。具體方法是這樣的:對於每一個單詞,刪掉其中出如今「CAMBRIDGE」中的字母。

輸入code

有且僅有一行,包含一個有大寫英文字母組成的單詞(長度:3~100)。

輸出input

有且僅有一行,包含一個修改過的單詞。string

樣例輸入it

LOVEio

樣例輸出function

LOVclass

數據範圍限制程序

單詞(長度: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.
相關文章
相關標籤/搜索