第一题——鸡腿の树荫
题目描述
【故事の背景】
又到了夏天啦~~鸡腿这样的胖纸最不喜欢大热天了。为了避暑,鸡腿早在去年就种了好多树,现在就可以享受树荫啦!但是鸡腿有一个坏习惯,他必须爬到树上去避暑„谁都不知道为什么„但是他的体重太大了,每次他爬上一棵树都会把它压塌了再下来。如果他还没爬爽,他还会把其他连续的一排树压倒„(反正是他种的)你是鸡腿的好盆友,自然想帮鸡腿改掉坏习惯。
【问题の描述】
现在你想统计一下,到底倒了多少树„„
我们假定鸡腿种的树是一共有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.