64,652
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
int main()
{
for (int n, m[1000], h, l, r, a; a = 0, scanf("%d", &n) == 1;)
{
for (h = 0; h < n; h++) scanf("%d", &m[h]);
for (h = 0; h < n; h++)
{
for (l = h - 1; l >= 0 && m[l] >= m[h]; l--);
for (r = h + 1; r < n && m[r] >= m[h]; r++);
if (m[h] * (r - l - 1) > a) a = m[h] * (r - l - 1);
}
printf("%d\n", a);
}
return 0;
}
想复杂了或简单了不行?难道也想标榜自己100%正确,从来就没错过?或是精神高尚?从而证明自己是圣人?假如未必能证明自己就是圣人,那也只是凡人而已。
假如是外国人就别看我的代码了,或带个翻译来读,自觉没机会与国际合作,也不逛外国论坛,假若有需要相信我是个活人,听说近来归国避难新冠病毒的就有觉得高国人一等的思想,若外国好何必回国?反过来就不说想了。。。今第一次不妨说说,后不再。
中文函数名变量名就把某人废了真是匪夷所思!虾米理由一堆匪夷所思!!
另外,正常的交流是欢迎的,就是不会去理会精神高尚反面典型的去言语.
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
const int maxn = 1e3+5;
struct node{
int height;
int width;
};
int n,height,top,index;
ll res,tmp;
node stack[maxn];
int main(){
while(cin>>n){
res = tmp = 0;
for(int i = 0;i < n ;i++){
scanf("%d",&height);
index = 0;
while(top > 0 && stack[top-1].height >= height){
tmp = stack[top - 1].height * (stack[top-1].width + index);
res = max(res,tmp);
index += stack[top-1].width;
top--;
}
.height = height;
stack[top].width = 1 + index;
top++;
}
index = 0;
while(top > 0){
tmp = stack[top - 1].height * (stack[top-1].width + index);
res = max(res,tmp);
index += stack[top-1].width;
top--;
}
cout<<res<<endl;
}
}
这样一改矩形就能头尾互寻,前后循环后的2句判断直接++ --,从而可以融合为一句(--k - ++j +1),若见怪就当我多言了,有空看看我的代码,难得平语,我这样写出于另一个方面的考量,循环多了。
[quote=引用 26 楼 lirg8405 的回复:]
代码边界判断少了个=,把j>0 修改为j>=0
应该不止这组数据,其他数据能确保正确?
题目的用例只给一个,实在是可以让设计的思路跑偏,因为,大部分精力和思路都用在实现目前用例的思路上了,完成后也没想那么多,同时,也发现了我写的问题了,解决问题是思路也有了,不妨再酝酿一段时间,待空闲实现一下,再看看是否都正确。 用你的代码测试了6个数据,这组数据最大应该是6*7=42.
void fund_findmax() { int nCount = 0; printf("请输入矩形的数量:"); scanf("%d", &nCount); if (nCount < 1 || nCount > 1000) { printf("输入不合法!\n"); return; } int nArray[1000] = {0}; for(int i=0; i<nCount; i++) { scanf("%d", &nArray[i]); } int nMax = 0; for(int i=0; i<nCount; i++) { //向前找 int j=i-1; while(j >= 0) //这里修改为>= { if (nArray[j] < nArray[i]) { break; } j--; } if (j < 0) j = 0; else j++; //向后找 int k = i+1; while(k < nCount) { if (nArray[k] < nArray[i]) { break; } k++; } if (k == nCount) k = nCount-1; else k--; int nTemp = (k-j+1)*nArray[i]; if (nTemp > nMax) nMax = nTemp; } printf("最大的矩形面积是:%d\n", nMax); }