#include <iostream>
using namespace std;
const int SIZE = 100;
int matrix[SIZE + 1][SIZE + 1];
int rowsum[SIZE + 1][SIZE + 1]; //rowsum[i][j]记录第 i 行前 j 个数的和
int m, n, i, j, first, last, area, ans;
int main()
{
cin >> m >> n;
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
cin >> matrix[i][j];
ans = matrix ①;
for(i = 1; i <= m; i++)
②
for(i = 1; i <= m; i++)
for(j = 1; j <= n; j++)
rowsum[i][j] = ③;
for(first = 1; first <= n; first++)
for(last = first; last <= n; last++)
{
④;
for(i = 1; i <= m; i++)
{
area += ⑤;
if(area > ans)
ans = area;
if(area < 0)
area = 0;
}
}
cout << ans << endl;
return 0;
}
利用前缀和的思想,计算出矩阵第i行前j列的和rowsum[i][j]。枚举所有列的组合,求出子矩阵和的最大值。
空①,初始化ans,让其等于矩阵第一行第一列的值matrix[1][1],所以应填入[1][1]
空②,初始化每行前缀和数组的第0项,将其置为00,用于之后计算前缀和,所以应填入rowsum[i][0]=0
空③,计算第i行的前缀和,所以应填入rowsum[i-1]+matrix[i][j]
空④,初始化area为00,所以应填入area=0
空⑤,使用前缀和数组计算first列到last列的和,rowsum[i][last]-rowsum[i][first-1]。
前序遍历序列与中序遍历序列相同的二叉树为( )。
A. 根结点无左子树的二叉树
B. 根结点无右子树的二叉树
C. 只有根结点的二叉树或非叶子结点只有左子树的二叉树
D. 只有根结点的二叉树或非叶子结点只有右子树的二叉树
要使前序遍历序列与中序遍历序列相同,对于任意非叶子结点,不能存在左子树,否则前序遍历序列与中序遍历序列不可能相同。除此之外,只有根结点的二叉树,前序、中序、后序遍历都相同。
#include<iostream>
using namespace std;
const int dayNum[]={-1,31,28,31,30,31,30,31,31,30,31,30,31};
int m, offset, i;
int main()
{
cin >> m;
cout <<"S M T W T F S"<<endl;//' '为tab制表符
①;
for (i = 1; i < m; i++)
offset = ②;
for (i = 0; i < offset; i++)
cout <<' ';
for (i = 1; i <= ③;i++)
{
cout << ④;
if(i==dayNum[m]||⑤==0)
cout << endl;
else
cout << ' ';
}
return 0;
}
通过偏移数offset将每个月的日期输出到对应的星期上。
空①,offset记录上个月的偏移数,1月份的偏移数为4,所以此空应填:offset=4
空②,计算第m个月的偏移数,所以应加上前一个月的天数并对7取余数,(offset+dayNum[i])%7
空③,输出第m个月的日期,dayNum[m] 空④,输出循环变量i表示的日期
空⑤,换行条件,当前日期加上偏移数如果是7的倍数时换行,所以应填入:(offset+i)%7
#include <iostream>
using namespace std;
const int MAXN = 1000;
int n,i,lbound,rbound,mid,m,count;
int x[MAXN];
int main()
{
cin >> n >> m;
for(i = 0; i < n; i++)
cin >> x[i];
lbound = 0;rbound = m;
while(①) {
mid=(lbound+rbound)/2;
②;
for(i = 0; i < n; i++)
{
if(③)
④;
}
if(count > n/2)
lbound = mid + 1;
else
⑤;
}
cout << rbound << endl;
return 0;
}
二分搜索求中位数。lbound和rbound即中位数的左右边界。
空①,二分搜索的循环条件,即lbound<rbound
空②,count记录x[]中比中位数mid大的数的个数,此时应该初始化为0,所以此空应填入count=0。
空③,if(count > n/2) lbound = mid + 1;表示:如果count的个数超过了一半,再到更大的值区间中搜索中位数,即mid不够大。所以此空应填入x[i]>mid。
空④,count++
空⑤,count <= n/2,到更小的值空间搜索,此时rbound=mid。