- 陈泽文 的博客
day10总结
- @ 2024-7-24 14:51:45
今天又考试了,我订正一下错题
1:有 7个一模一样的苹果,放到 3个一样的盘子中,一共有()种放法。
A. 7
B. 8
C. 21
D.
此题应用插空法解决:
一:两空盘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 //更新右边界