1. 程式人生 > >codevs 1392 合並傻子

codevs 1392 合並傻子

none ems through 範圍 idt pac 脫殼 wrap tro

1392 合並傻子

時間限制: 1 s 空間限制: 128000 KB 題目等級 : 鉆石 Diamond 題目描述 Description

在一個園形操場的四周站著N個傻子,現要將傻子有次序地合並成一堆.規定每次只能選相鄰的2個傻子合並成新的一個傻子,並將新的一個傻子的RP數,記為該次合並的RP數。
將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 Description

數據的第1行試正整數n和m(1≤N≤100,m在longint範圍之內)表示有N個傻子.第2行有N個數,分別表示合並每個傻子的所掉的RP數

輸出描述 Output Description

輸出文件僅一行包含一個句子表示鐘某人說的話。

樣例輸入 Sample Input

4 -9999

4 4 5 9

樣例輸出 Sample Output

I am..Sha...X

數據範圍及提示 Data Size & Hint

出題人不告訴你是1S

鐘某人不是zhx??

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 int n,m,x,a[1001],fmax[1001][1001],fmin[1001][1001];
 6 int maxx=-999999999,minn=999999999;
 7 
 8 int main() {
 9     scanf("%d%d",&n,&m);
10     memset(fmin,127,sizeof(fmin));
11     for(int i=1; i<=n*2; i++) fmin[i][i]=0;
12     for(int i=1; i<=n; i++) {
13         scanf("%d",&x);
14         a[i]=a[i-1]+x;
15     }
16     for(int i=n+1; i<=2*n-1; i++) a[i]=a[i-n]+a[n];
17     for(int l=1; l<=n; l++)
18         for(int i=1; i<=n-l; i++) 
19         {
20             int j=l+i;
21             for(int k=i; k<j; k++) 
22             {
23                 fmax[i][j]=max(fmax[i][j],fmax[i][k]+fmax[k+1][j]+a[j]-a[i-1]);
24                 fmin[i][j]=min(fmin[i][j],fmin[i][k]+fmin[k+1][j]+a[j]-a[i-1]);
25             }
26         }
27     for(int i=1; i<=n; i++) {
28         if(minn>fmin[i][i+n-1]) minn=fmin[i][i+n-1];
29         if(maxx<fmax[i][i+n-1]) maxx=fmax[i][i+n-1];
30     }
31     
32     if(m>maxx) printf("It is easy\n");
33     else if(m<minn) printf("I am..Sha...X\n");
34     else printf("I will go to play WarIII\n");
35     return 0;
36 }

codevs 1392 合並傻子