今天又考试了,我订正一下错题

1:有 7个一模一样的苹果,放到 3个一样的盘子中,一共有()种放法。

A. 7

B. 8

C. 21

D. 373^7

此题应用插空法解决:

一:两空盘1种

0 ___ 0___ 7___

二:一空盘:即从六空中插入一个间隔,即3种

6___ 1___ 0___

5___ 2___ 0___

4___ 4___ 0___

三:无空盘即从六空插两间隔有4种

5___ 1___ 1___

4___ 1___ 2___

3___ 1___ 3___

3___ 2___ 2___

最后答案为8种。

2:从一个 4×4的棋盘(不可旋转)中选取不在同一行也不在同一列上的两个方格,共有____种方法。

我们发现这是组合问题,也就是从16个格子中选择两个格子组合,不能重复。于是出现式子:16*15/2=120,对吗?不对。还有一个问题:不在同一行也不在同一列上的两个方格。所以第一个格子占了,有16种可能,第二个格子就只有9种可能了。

所以:16*9/2=72就对了,故填写72。

3:约定二叉树的根节点高度为 1。一棵结点数为 2016 的二叉树最少有( )个叶子结点;一棵结点数为 2016 的二叉树最小的高度值是11。

我们可以把这看成一个全是左子树的的二叉树,所以它只有一个根节点

4:阅读程序写结果

#include <iostream>
using namespace std;

int main()
{
	int i = 100, x = 0, y = 0;
	while (i > 0)
	{
		i--;
		x = i % 8;
		if (x == 1)
			y++;
	}
	cout << y << endl;
	return 0;
}

输出______

我们一个一个枚举

1%8=1

9%8=1

17%8=1

25%8=1

33%8=1

41%8=1

49%8=1

57%8=1

65%8=1

73%8=1

81%8=1

89%8=1

97%8=1

共有13种

5:读入数据

#include<bits/stdc++.h>
using namespace std;
int readint()
{
    int num=0;
    int negative=0;
    char c;
    c=cin.get();
    while((c<'0'||c>'9')&&c!='-')
    {
        c=//问题1;
    }
    if(c=='-')
    {
        negative=0;
    }
    else
    {
        //问题2;
    }
    while(//问题3)
    { 
        //问题4;
        c=cin.get()
    }
    if(negative==1)
    {
        //问题5;
    }
}
return num;
int main()
{
    int  a,b;
    cin>>a>>b;
    s=readint();
    b=readint();
    cout<<a<<endl<<b<<endl;
return 0;
}

问题1:cin.get()

问题2:num=c-'0';

问题3:c>='0'&&c<='9'

问题4:num=num*10+c-'0';

问题5:return -num

6:郊游活动

#include <iostream>
using namespace std;
#define MAXN 1000000

int n, B, A, M[MAXN], C[MAXN], l, r, ans, mid;

bool check(int nn) {
	int count = 0, i, j;
	i=//问题1;//假设有nn个人可以买得起自行车,下标从n-nn+1开始到n结束
	j=1;
	while (i <= n) {
		if(//问题2)
                {
			count += C[j] - M[i];
                }
		i++;
		j++;
	}
	return //问题3;//如果买不起判断一下公款够不够用
}
	
void sort(int a[], int l, int r) //快排
{
	int i = l, j = r, x = a[(l + r) / 2], y;
	while (i <= j) 
        {
		while (a[i] < x) 
                {
                    i++;
                }
		while (a[j] > x)
                {
                    j--;
                }
		if (i <= j) 
                {
			y = a[i];
                        a[i] = a[j];
                        a[j] = y;
                }
	        i++;
                j--;
	}
    if (i < r) 
    {
       sort(a,i,r);
    }
    if (l < j) 
    {
       sort(a,l,j);
    }
}

int main() {
	int i;
	cin >>n>>B>>A;
	for (i = 1; i <= n; i++)
        {
		cin>>M[i];
        {
	for (i = 1; i <= B; i++)
        {
		cin>>C[i];
        }
	sort(M,1,n);
	sort(C,1,B);
	l=0;
	r=n;
	while (l <= r) //左边界小于右边界
       {
		mid = (l + r) / 2;//mid等于中间值
		if(//问题4)
                {
                        ans = mid;//给ans赋值
			l=mid+1;//更新左边界
		}
                else
                {
			r=//问题5;//更新右边界
                }
	}
	cout <<ans<<endl;
	return 0;
}

问题1:n-nn+1 //假设有nn个人可以买的起自行车

问题2:m[i]<c[j] //第m[i]个人的经费不够

问题3:count<=A //看它的值是否小于公款,如果小于返回true,否则更新左边界

问题4:check(mid) //把nn赋值为mid

问题5:mid-1 //更新右边界