NOIP2016普及组初赛难点整理

选择题

  1. 如果开始时计算机处于小写输入状态,现在有一只小老鼠反复按照 CapsLock、 字母键 A、字母键 S 和字母键 D 的顺序循环按键,即 CapsLock、A、S、D、CapsLock、a、s、d、…,屏幕上输出的第 81 个字符是字母( )。

【解析】屏幕上输出的字符:ASDasdASDasd…。81是3的倍数,所以输出的字符应该是D或者d。如果按3个字符一组,会发现奇数组为大写字符,偶数组为小写字符, 81 / 3 = 27 81/3=27 81/3=27为奇数组,所以屏幕上输出的第
81 个字符是字母D

  1. 设简单无向图 G G G 16 16 16 条边且每个顶点的度数都是 2 2 2,则图 G G G 有( )个顶点。

【解析】 G G G 16 16 16 条边,每条边连接两个点、贡献2度,所以度数一共是 32 32 32。而每个顶点的度数都是 2 2 2,所以一共有 32 ÷ 2 = 16 32\div2=16 32÷2=16个顶点。

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

【解析】 7 7 7 个一模一样的苹果,放到 3 3 3个一样的盘子,允许盘子为空,等价于将 7 7 7分解为1、2、3个正整数的和,可以手动枚举,一共有8种。

问题求解

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

【解析】 4 × 4 4 \times 4 4×4的棋盘如下图所示,可以在16个方格中任选一个方格,此时第二个方格只能选不同行、不同列的其它9方格。注意:两个方格是相同的,所以不应该考虑先后顺序。答案: 16 × 9 ÷ 2 = 72 16\times9\div2=72 16×9÷2=72

在这里插入图片描述

阅读程序写结果

#include <iostream>
using namespace std;
int main()
{
    int a[6] = {1, 2, 3, 4, 5, 6};
    int pi = 0;
    int pj = 5;
    int t, i;
    while (pi < pj)
    {
        t = a[pi];
        a[pi] = a[pj];
        a[pj] = t;
        pi++;
        pj--;
    }
    for (i = 0; i < 6; i++)
        cout << a[i] << ",";
    cout << endl;
    return 0;
}

【解析】程序将数组a[]中下标为in-1-i位置的数进行交换,注意:输出时不要忘了写,

完善程序

(郊游活动)有 n n n 名同学参加学校组织的郊游活动,已知学校给这 n n n 名同学的郊游总经费为 A A A 元,与此 同时第 i i i 位同学自己携带了 M i M_i Mi元。为了方便郊游,活动地点提供 B ( ≥ n ) B(\ge n) B(n) 辆自行车供人租用,租用第 j j j 辆自行车的价格为 C j C_j Cj 元,每位同学可以使用自己携带的钱或者学校的郊游经费,为了方便账务管理,每位同学只能为自己租用自行车,且不会借钱给他人,他们想知道最多有多少位同学能够租用到自行车。
本题采用二分法。对于区间 [l, r], 我们取中间点 mid 并判断租用到自行车的人数能否达到 mid。判断的过程是利用贪心算法实现的。

#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 =  ①  ;
    j = 1;
    while (i <= n) {
        if( ② )
            count += C[j] - M[i];
        i++;
        j++;
     }
    return ③ ;
}

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;
        if ( ④ ) {
            ans = mid;
            l = mid + 1;
        }
        else
            r = ⑤ ;
    }
    cout << ans << endl;
    return 0;
}

【解析】

  • 空①,bool check(int nn)函数检查带钱最多nn个同学,能不能在总经费为A的情况下,租到自行车。M[]数组已安装从小到大排序,变量i从第n-nn+1个同学开始,判断后nn个同学是否满足要求。

猜你喜欢

转载自blog.csdn.net/qiaoxinwei/article/details/107895674