北京顺义有网站建设公司吗免费制作网页
web/
2025/9/29 23:02:16/
文章来源:
北京顺义有网站建设公司吗,免费制作网页,博客发布 网站模版,flash网站怎么做题干#xff1a;
描述
2001年9月11日#xff0c;一场突发的灾难将纽约世界贸易中心大厦夷为平地#xff0c;Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件#xff0c;Mr. F决定自己用水晶来搭建一座双塔。
Mr. F有N块水晶#xff0c;每块水晶有一个高度#xff0…题干
描述
2001年9月11日一场突发的灾难将纽约世界贸易中心大厦夷为平地Mr. F曾亲眼目睹了这次灾难。为了纪念“9?11”事件Mr. F决定自己用水晶来搭建一座双塔。
Mr. F有N块水晶每块水晶有一个高度他想用这N块水晶搭建两座有同样高度的塔使他们成为一座双塔Mr. F可以从这N块水晶中任取M1≤M≤N块来搭建。但是他不知道能否使两座塔有同样的高度也不知道如果能搭建成一座双塔这座双塔的最大高度是多少。所以他来请你帮忙。
给定水晶的数量N1≤N≤100和每块水晶的高度HiN块水晶高度的总和不超过2000你的任务是判断Mr. F能否用这些水晶搭建成一座双塔两座塔有同样的高度如果能则输出所能搭建的双塔的最大高度否则输出“Impossible”。
格式
输入格式
输入的第一行为一个数N表示水晶的数量。第二行为N个数第i个数表示第i个水晶的高度。
输出格式
输出仅包含一行如果能搭成一座双塔则输出双塔的最大高度否则输出一个字符串“Impossible”。
样例1
样例输入1
5
1 3 4 5 2Copy
样例输出1
7Copy
来源
某校NOIP模拟题
解题报告
非常巧妙的dp题类似于背包dp[i][j]表示前i块木块高块和低块的差值为j时最低的木块的最大高度。其实维护的是最高的木块的最大高度也可以
注意判断无解是0而不是0。因为一直不选木块也可以成功转移到dp[n][0]只是值为0)。
AC代码
#includecstdio
#includeiostream
#includealgorithm
#includequeue
#includestack
#includemap
#includevector
#includeset
#includestring
#includecmath
#includecstring
#define FF first
#define SS second
#define ll long long
#define pb push_back
#define pm make_pair
using namespace std;
typedef pairint,int PII;
const int INF 0x3f3f3f3f;
const int MAX 100 5;
int n;
int dp[MAX][5555];
int a[MAX];
int main()
{cinn;memset(dp,-INF,sizeof dp);dp[0][0] 0;for(int i 1; in; i) cina[i];for(int i 1; in; i) {for(int j 0; j2004; j) { dp[i][j] max(dp[i][j],dp[i-1][j]);//第i块砖不放if(ja[i])dp[i][j] max(dp[i][j],dp[i-1][j-a[i]]);//放在高的上 dp[i][j] max(dp[i][j],dp[i-1][ja[i]]a[i]);//放在矮的上且没超过高塔if(a[i]j)dp[i][j] max(dp[i][j],dp[i-1][a[i]-j](a[i]-j));}}int ans dp[n][0];if(ans 0) printf(%d\n,ans);else printf(Impossible\n);return 0 ;
}
/*
2
1 3*/
如果要维护最高高度的话就这样转移
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/84126.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!