您的位置:首页 > 其它

1392 合并傻子

2015-08-02 15:00 239 查看
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

**********************************很好的区间型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]
<<" "<<f2[1]
<<endl;
if(m > f2[1]
)
{
cout<<"It is easy"<<endl;
}
else if(m < f1[1]
)
{
cout<<"I am..Sha...X"<<endl;
}
else
{
cout<<"I will go to play WarIII"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: