合并傻子
背景 Background
从前有一堆傻子,钟某人要合并他们~
但是,合并傻子是要掉RP的......
描述 Description
在一个园形操场的四周站着N个傻子,现要将傻子有次序地合并成一堆.规定每次只能选相邻的2个傻子合并成新的一个傻子,并将新的一个傻子的RP数,记为该次合并的RP数。
(合并方法与NOI1999石子合并(本题库的沙子合并)相同,请大家参考上题合并方法)
将N个傻子合并成1个的最小RP数为RPn和最大RP数为RPx.
钟某人要合并他们,钟某人现在的RP为m,但是他要小心....
if m>RPx then 钟某人能很轻松的合并他们,并说出 ‘It is easy’
else if m<RPn 钟某人很担心,因为他必然由此变成一个沙茶,这时他要说:‘I am..Sha...X’(以便提升RP)
else 钟某人仍然担心自己可能成为一个沙茶,所以他要金蝉脱壳说:‘I will go to play WarIII’
输入格式 Input Format
数据的第1行试正整数n和m(1≤N≤100,m在longint范围之内)表示有N个傻子.第2行有N个数,分别表示合并每个傻子的所掉的RP数
输出格式 Output Format
输出文件仅一行包含一个句子表示钟某人说的话。
样例输入 Sample Input
4 -9999
4 4 5 9
样例输出 Sample Output
I am..Sha...X
时间限制 Time Limitation
出题人不告诉你是1S
注释 Hint
傻子+傻子=?
分析:本题的确有些傻,基本与p1055一样同属合并石子问题,只是再求一个f[i,j]的最大值即可
代码和p1055基本一致,直接ps过来
代码
1 program p1062;
2 var
3 i,j,n,k,min1,min2,max:longint;
4 a:array[1..101]of longint;
5 f1,f2:array[1..101,1..101]of longint;
6 begin
7 assign(input,'input.txt');
8 reset(input);
9 assign(output,'output.txt');
10 rewrite(output);
11 readln (n,max);
12 for i:=1 to n do
13 read(a[i]);
14 fillchar(f1,sizeof(f1),0);
15 fillchar(f2,sizeof(f2),0);
16 for i:=1 to n-1 do
17 begin
18 f1[i,2]:=a[i]+a[i+1]; //初始,将相邻的两堆合并
19 f2[i,2]:=a[i]+a[i+1];
20 end;
21 for j:=3 to n do
22 for i:= 1 to n-j+1 do
23 begin
24 min1:=maxlongint;
25 min2:=0;
26 for k:=1 to j-1 do
27 begin
28 if f1[i,k]+f1[i+k,j-k]<min1 then //动态转移方程f[i,j]=min{f[i,k]+f[k+i,j-k]}+sum[i,j]; f[i,j]表示从第i堆开始合并k堆的最小值,sum[i,j]是从i到j的和
29 min1:=f1[i,k]+f1[i+k,j-k];
30 if f2[i,k]+f2[i+k,j-k]>min2 then
31 min2:=f2[i,k]+f2[i+k,j-k];
32 end;
33 for k:=i to i+j-1 do
34 begin
35 inc(min1,a[k]);
36 inc(min2,a[k]);
37 end;
38 f1[i,j]:=min1;
39 f2[i,j]:=min2;
40 end;
41 if f2[1,n]<=max then write('It is easy')
42 else
43 if f1[1,n]>max then write('I am..Sha...X')
44 else
45 write('I will go to play WarIII');
46 close(input);
47 close(output);
48 end.

浙公网安备 33010602011771号