1392 合并傻子

来源:互联网 发布:adobe音频编辑软件 编辑:程序博客网 时间:2024/04/30 21:01
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 Input4 -99994 4 5 9样例输出 Sample OutputI am..Sha...X数据范围及提示 Data Size & Hint出题人不告诉你是1S**********************************很好的区间型dp练习**********************注意求最大值的数组f和求最小值的数组f的f[][]初始值不同 #include<iostream>#include<string.h>#include<algorithm>#include<cstdio>using namespace std;long f1[110][110];long f2[110][110];int  w[101],sum[101];int main(){memset(sum,0,sizeof(sum));int i,j,l,n;long m;cin>>n>>m;for(i = 0; i <= 101; i++){for(j = 0; j <= 101; j++){f1[i][j] = 1e10;              //求最小值的要尽量大 f2[i][j] = 0;                //求最大值的要最小 }}for(i = 1; i <= n; i++){cin>>w[i];sum[i] = sum[i-1]+w[i];f1[i][i] = f2[i][i] = 0;}for(l = 2; l <= n; l++){for(i = 1; i <= n-l+1; i++){for(j = i; j < i+l; j++){f1[i][i+l-1] = min(f1[i][i+l-1] , f1[i][j]+f1[j+1][i+l-1]);f2[i][i+l-1] = max(f2[i][i+l-1] , f2[i][j]+f2[j+1][i+l-1]);}f1[i][i+l-1] += sum[i+l-1] - sum[i-1]; f2[i][i+l-1] += sum[i+l-1] - sum[i-1];}}//cout<<f1[1][n]<<" "<<f2[1][n]<<endl;if(m > f2[1][n]){cout<<"It is easy"<<endl;}else if(m < f1[1][n]){cout<<"I am..Sha...X"<<endl;}else{cout<<"I will go to play WarIII"<<endl;}return 0;}

0 0
原创粉丝点击