jzoj C组 2017.1.20 比赛

第一题——鸡腿の树荫

题目描述

【故事の背景】

 又到了夏天啦~~鸡腿这样的胖纸最不喜欢大热天了。为了避暑,鸡腿早在去年就种了好多树,现在就可以享受树荫啦!但是鸡腿有一个坏习惯,他必须爬到树上去避暑„谁都不知道为什么„但是他的体重太大了,每次他爬上一棵树都会把它压塌了再下来。如果他还没爬爽,他还会把其他连续的一排树压倒„(反正是他种的)你是鸡腿的好盆友,自然想帮鸡腿改掉坏习惯。 

【问题の描述】

 现在你想统计一下,到底倒了多少树„„

 我们假定鸡腿种的树是一共有L棵,从1到L编号,按照1m的距离依次排列,可以看成数轴上1到L的一共L个点。每天鸡腿睡塌的树是一个连续的区间,鸡腿一共花了N天来糟蹋树木,给定每天睡的区间(鸡腿可能会不小心又爬到压塌的树上,使得破坏程度更大),求出所有不曾被压塌的树的数量。 

输入

第1行两个整数N和L。

第2-N+1行,每行两个整数Xi和Yi表示一段区间。

输出

N行,每行一个数表示没有被睡过的树木的数量。

样例输入

2 4

2 3

3 4

样例输出

2

1

数据范围限制

【数据の规模】

对于50%的数据:Xi,Yi,N≤1000;

对于100%的数据: Xi,Yi,N≤10^5。


这题用暴力只能拿40分,我们可以同a数组来存储该位置的区间。我们可以分两种情况来判断:
①如果该a[x]为0(表明还么有枚举到该棵树),则 a[x]:=y; inc(x); dec(total);
②如果a[x]有值(表明以前已经有枚举到这棵树),则z:=a[x]; if a[x]< y then a[x]:=y; x:=z+1;
最后再输出total


第二题——晒衣服题目描述

洗完衣服后,你就要弄干衣服。衣服在自然条件下用1个单位的时间可以晒干A点湿度。现在买了1台烘衣机,使用烘衣机可以让你用1个单位的时间使1件衣服除开自然晒干的A点湿度外,还可烘干B点湿度,但在1个单位的时间内只能对1件衣服使用。

 N件衣服因为种种原因而不一样湿,现在告诉你每件衣服的湿度,要你求出弄干所有衣服的最少时间(湿度为0为干)。

输入

第一行N,A,B;

接下来N行,每行一个数,表示衣服的湿度(1<=湿度,A,B<=500000,1<=N<=500000)。

输出

一行一个整数,表示最少时间。

样例输入

3 2 1

1

2

3

样例输出

1

数据范围限制

(1<=湿度,A,B<=500000,1<=N<=500000)

提示

【样例解析】:

第1个单位时间内,用机器处理第3件衣服,此外,所有衣服自然晒干2。

这题可以用两种方法做
①这题可以用水法,先找出最大的湿度,然后将该湿度b[w]加一。一切时间决定于最大的湿度。
②二分答案。


代码如下:

var b:array[0..500000]of longint;
    n,max,i,x,y,w,l:longint;

begin
  assign(input,'dry.in');
  assign(output,'dry.out');
  reset(input);
  rewrite(output);
  readln(n,x,y);
  for i:=1 to n do
    begin
      readln(w);
      inc(b[w]);
      if w>max then max:=w;
    end;
  l:=0;
  while max>l*x do
    begin
      dec(b[max]);
      inc(b[max-y]);
      while b[max]=0 do dec(max);
      inc(l);
    end;
  writeln(l);
  close(input);
  close(output);
end.

第三题——鸡腿の小路

题目描述

【故事の背景】

 鸡腿终于意识到了毁坏树木是不对的,为了补偿之前毁坏树木造成的景观破坏,他决定在这些个树木被毁坏的地方建一条小路。为了鼓励鸡腿你当然也投入到了如火如荼的建设活动中来。经过一个月的精心建设,小路已经有了模样,不过因为砖头还没完全铺好,一些位置还是到不了。

【问题の描述】

 鸡腿想到了一个很高(sha)明(bi)的问题,现在这条小路的开头和结尾都弄好了,但是中间有很多位置还是坑爹的没铺地砖,那么鸡腿从1的位置开始走,因为腿短的原因每次最多走M格(虽然腿短,M却可以很大哦~),鸡腿能不能从开头走到结尾呢? 

输入

第一行两个整数N、M。

第2行,一个长度为N的字符串表示建设情况,若为“.”表示建好了,若为“#”表示没建好。

保证开头结尾都建好了。

输出

一行一个字符串,如果可以就输出“YES”,否则输出“NO”。

样例输入

input1:

2 1

..

Input2

5 2

.#.#.

Input3

7 3

.#.###.

样例输出

Output1

YES

Output2

YES

Output3

NO

数据范围限制

对于50%的数据:0 < N,M ≤ 1000;

100%的数据:0 < N,M ≤ 3*10^5。


壮哉我大水题也

此题就是一道大水题,竟然还放在第三题。
枚举有没有长度大于等于他最多跨的格子,就AC


代码如下:

var  n,m,i,l:longint;
     x:ansistring;
begin
  assign(input,'road.in');
  assign(output,'road.out');
  reset(input);
  rewrite(output);
  readln(n,m);
  readln(x);
  for i:=1 to length(x) do
    if x[i]='#' then
      begin
        l:=i;
        while (x[l]='#')and(l<=n) do
          begin
            inc(l);
            if l-i>=m then
              begin
                write('NO');
                close(input);
                close(output);
                halt;
              end;
          end;
      end;
  write('YES');
  close(input);
  close(output);
end.

第四题——鸡腿の游戏

题目描述

【故事の背景】

  俗话说的好,早睡早起方能养生„„鸡腿终于结束了建小路的工程,他终于有时间出来玩啦~~鸡腿决定来找你玩他刚发明的新式游戏~~

【问题の描述】

  鸡腿想到了一个很高(sha)明(bi)的游戏。给定一个N,然后写出两个长度为N*2的01串上下对应。每次呢鸡腿先走,他可以选择一列,如果上面那个是1他就得一分否则不得分。然后你走,你也选择一列,下面那个是1你就得一分否则不得分。选过的列不能再选,所有的列都被选了就结束了!最后谁得分最高谁获胜。 

输入

第一行两个整数N。

第2行和第3行,每行一个长度为2*N的01串。

输出

一行一个字符串,如果鸡腿赢输出“First”,如果你赢输出“Second”,平局输出“Draw”。

样例输入

Input1

2

0111

0001

Input2

3

110110

001001

Input3

4

01100000

10010011

样例输出

Output1

First

Output2

First

Output3

Second

数据范围限制

【数据の规模】

对于50%的数据:0 < N ≤ 5000;

100%的数据:0 < N ≤ 10^6。


也是一道大水题,不过找规律需要点时间。
我们将上面为一的个数设为total1
将下面为一的个数设为total2
将上面和下面都为一的个数设为total
规律如下:
①如果total1>total2 则输出First
②如果total1=total2:
(1)如果total为偶数,则输出Draw
(2)如果total为奇数,则输出First
③如果total1=total2-1,则输出Draw
④如果total1< total2-1,则输出Second


代码如下:

var  n,total,total1,total2:int64;
     i:longint;
     x,y:array[1..10000000]of char;
begin
  assign(input,'game.in');
  assign(output,'game.out');
  reset(input);
  rewrite(output);  
  readln(n);
  for i:=1 to n*2 do
    begin
      read(x[i]);
      if x[i]='1' then inc(total1);
    end;
  readln;
  for i:=1 to n*2 do
    begin
      read(y[i]);
      if y[i]='1' then
        begin
          inc(total2);
          if x[i]='1' then inc(total);
        end;
    end;
  if total1>total2 then write('First');
  if total1<total2-1 then write('Second');
  if total1=total2-1 then write('Draw');
  if total1=total2 then
    if total mod 2=0 then write('Draw')
    else write('First');
  close(input);
  close(output);
end.
原文地址:https://www.cnblogs.com/Comfortable/p/8412442.html