温馨提示×

NOIP C++编程实战案例

c++
小樊
82
2024-12-11 03:24:36
栏目: 编程语言

NOIP(全国青少年信息学奥林匹克竞赛)是中国计算机学会主办的一项传统竞赛活动,旨在发现和培养青少年计算机编程人才。以下是一些C++编程实战案例,这些案例不仅展示了C++编程的实际应用,也反映了NOIP竞赛中可能遇到的题型和难度:

接水问题

  • 问题描述:学校里有一个水房,有m个水龙头和n名同学,每个水龙头每秒钟供水量为1。同学们按照接水顺序接水,求所有同学接完水所需的总时间。
  • 解题思路:使用贪心算法,每次让当前接水量最少的同学接水,直到所有同学都接完水。
  • 代码示例
#include<iostream>
using namespace std;
int main(){
    int m, n;
    cin >> m >> n;
    if(n > m) n = m;
    int arr[10000];
    int flag = 0;
    for(int i = 1; i <= m; i++){
        cin >> arr[i];
        flag += arr[i];
    }
    int index = n + 1;
    int count = 0;
    while(flag != 0){
        for(int i = 1; i <= n; i++){
            if(arr[i] > 0){
                arr[i]--;
                flag--;
            }
            if(arr[i] == 0){
                arr[i] = arr[index];
                arr[index] = 0;
                if(index != m) index++;
            }
        }
        count++;
    }
    cout << count;
    return 0;
}

铺砖问题

  • 问题描述:对于一个2行N列的走道,用12和22的砖去铺满,求有多少种不同的铺法。
  • 解题思路:使用递归和动态规划的思想,通过记忆化搜索来减少重复计算。
  • 代码示例
#include<iostream>
#include<cstring>
using namespace std;
long long pave(int n){
    long long c[3] = {0};
    c[0] = 1;
    c[1] = 3;
    c[2] = 5;
    if(n == 1) return 1;
    else if(n == 2) return 3;
    else if(n == 3) return 5;
    else return pave(n - 1) + 2 * pave(n - 2);
}
int main(){
    int n;
    cout << "请输入走道的列数N" << endl;
    while(cin >> n){
        if(n == 0){
            cout << "输入有误,请重新输入!" << endl;
            continue;
        }
        cout << "对应的铺法有:" << endl;
        cout << pave(n) << endl;
        cout << "铺砖已完成" << endl;
        cout << "请输入下一走道的列数:(无其他输入请按EOF结束)" << endl;
    }
    return 0;
}

龙虎斗

  • 问题描述:给定n个军营和m个工兵,每个军营有一定数量的工兵,求最少需要多少工兵才能将所有军营全部占领。
  • 解题思路:使用动态规划的思想,通过构建一个二维数组来记录每个状态下的最小工兵数,最终得到结果。
  • 代码示例
#include<iostream>
using namespace std;
long long n, c[1000010], m, p1, s1, s2;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> c[i];
    }
    cin >> m >> p1 >> s1 >> s2;
    //p1军营加上s1个工兵c[p1] += s1;//原始气势
    long long sum1 = 0, sum2 = 0;
    for (int i = 1; i <= n; i++) {
        if (i < m) {
            //龙的气势
            sum1 += (m - i) * c[i];
        } else if (i > m) {
            //虎的气势
            sum2 += (i - m) * c[i];
        }
    }
    //判断s2加给谁比较好
    long long mmin = 1e19, index;
    for (int i = 1; i <= n; i++) {
        long long total1 = sum1, total2 = sum2;
        //加给龙虎其中一方
        if (i < m) {
            total1 += (m - i) * s2;
        } else if (m < i) {
            total2 += (i - m) * s2;
        }
        //计算气势差
        long long res = total1 > total2 ? total1 - total2 : total2 - total1;
        //记录最小的气势差 和 被加工兵的兵营号
        if (mmin > res) {
            mmin = res;
            index = i;
        }
    }
    cout << index;
    return 0;
}

这些案例展示了C++编程在实际应用中的多样性和复杂性,同时也反映了NOIP竞赛对选手编程能力和算法设计能力的考察。通过解决这些问题,参赛者可以提高自己的编程技巧和算法设计能力。

0