251225 算法2 期末练习

问题 A: A018蜜蜂路线

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;

int dp[100];
int main(){
    int m,n;
    scanf("%d%d",&m,&n);
    dp[m + 1] = 1;
    dp[m + 2] = 2;
    dp[m + 3] = 1 + 2;

    for(int i = m + 3;i <= n;i++){
        dp[i] = dp[i - 1] + dp[i - 2];
    }
    printf("%d\n",dp[n]);

}

问题 B: B006 俄罗斯套娃

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int arr[1005];
void swap(int arr[],int a,int b){
    int t = arr[a];
    arr[a] = arr[b];
    arr[b] = t;
}

int main(){
    int n;
    int cnt = 0;
    bool change = false;
    bool shao = false;
    scanf("%d",&n);
    for(int i = 0;i < n;i++){
        scanf("%d",&arr[i]);
    }

    for(int i = 0;i < n - 1;i++){
        for(int k = 0;k < n - i - 1;k++){
            if(arr[k] > arr[k + 1]){
                swap(arr,k,k + 1);
                change = true;
                cnt++;
                if(cnt > n * (n - 1) / 2 - 1){
                    shao = true;
                    break;
                }
            }
        }
        if(!change || shao)break;
    }

    if(!shao)printf("YES\n");
    else printf("NO\n");

}

问题 C: C001 字符串计数

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
string a[100005];
int times[100005];



int main(){
    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;i++){
            cin >> a[i];
        }

        //cout << a[n - 1];
        sort(a,a+n);
//        for(int i = 0;i < n;i++){
//                cout << a[i] << ' ';
//        }
        int cnt = 1;
        for(int i = 0;i < n;i++){
            if(a[i] == a[i + 1]){
                cnt++;
            }else{
                times[cnt]++;
                cnt = 1;
            }
        }

        for(int i = 1; i <= 100000;i++){
            if(times[i]!=0)printf("%d %d\n",i,times[i]);
        }


    }

}

问题 D: D002 最长上升子序列

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int dp[1005];

int main(){

    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;i++){
            scanf("%d",&a[i]);
        }
        fill(dp,dp+1005,1);

        for(int i = 1;i < n;i++){
            for(int k = i - 1;k >= 0;k--){
                if(a[i] > a[k]){
                    dp[i] = max(dp[i],dp[k] + 1);
                }
            }
        }

        printf("%d\n",dp[n - 1]);
    }



}

问题 E: E009 小木棒

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int stick[70];
int visit[70];
int stick_sum;
int now_ave,n;

bool dfs(int len,int ok_stick,int index){ //剩余长度 已拼好木棒数 当前拼接的下标
    if(ok_stick == n)return true;//达到拼接后木棍总长度,说明小木棒全部用完,搜索结束
    if(len == 0){
        len = now_ave;
        index = n;
    }
    for(int i = index - 1;i >= 0;i--){
        if(stick[i] > len)continue;
        if(!visit[i] && stick[i] <= len){
            visit[i] = true;
            if(dfs(len - stick[i],ok_stick + 1,i))return true;
            visit[i] = false;
            if(len == now_ave)return false;
        }
    }
    return false;
}

int main(){

    int max_stick,min_stick,lens_sum;
    while(scanf("%d",&n) != EOF){
        if(n == 0)break;
        lens_sum = 0;
        for(int i = 0;i < n;i++){
            scanf("%d",&stick[i]);
            lens_sum += stick[i];
        }
        sort(stick,stick + n);
        max_stick = stick[n - 1];
        min_stick = stick[0];

        int res = lens_sum;

        for(int i = min_stick;i <= lens_sum / 2;i++){
            if(lens_sum % i == 0){
                //更新平均长度,visit初始化,更新需要的木棒数
                now_ave = i;
                fill(visit,visit + n,0);
                stick_sum = lens_sum / now_ave;
                //深搜
                if(dfs(i,0,n)){
                    res = i;
                    break;
                }

            }

        }
        printf("%d\n",res);

    }

}

问题 F: F008 排队买饭

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
double a[10000];
int main(){

    int n;
    while(scanf("%d",&n) != EOF){
        for(int i = 0;i < n;i++){
            scanf("%lf",&a[i]);
        }
        sort(a,a+n);
        double time = 0;
        for(int i = 0;i < n;i++){
            time += a[i] * (n - i);
        }
        double res = time / n;
        printf("%.2f\n",res);
    }

}
相关推荐
大明者省9 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
白狐_79811 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander25811 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记11 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
杨航 AI12 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型12 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
旖旎夜光12 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口
叠层归一研究院14 小时前
AGI 系统(十一):二阶网络 — 二阶递归 × 多主体 (元符号网络)
开发语言·人工智能·算法·php·agi
zlinear数据采集卡14 小时前
D223的PWM电机控制:6路独立脉冲+加减速算法深度解析
arm开发·stm32·嵌入式硬件·算法·fpga开发·架构
杨石兴15 小时前
31、玩具MoM:用2x2矩阵串起全套流程
人工智能·算法·矩阵·电磁学