NOIP2014、2015普及组初赛难点整理

#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。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值