Contest3111 - 计科2101~2104算法设计与分析上机作业07

这篇具有很好参考价值的文章主要介绍了Contest3111 - 计科2101~2104算法设计与分析上机作业07。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题 A: 有重复元素的排列问题

题目描述

设R={ r 1 , r 2 , …, r n }是要进行排列的n个元素。其中元素r 1 , r 2 , …, r n 可能相同。试设计一个算法,
列出R的所有不同排列。给定n 以及待排列的n 个元素。计算出这n 个元素的所有不同排列。

输入

第1 行是元素个数n,1≤n≤500。接下来的1 行是待排列的n个元素。

输出

按字典序输出计算出的n个元素的所有不同排列,输出最后1行中的数是排列总数。

样例输入 

4
aacc

样例输出 

aacc
acac
acca
caac
caca
ccaa
6

嗯,next_permutation

记得要提前sort一下嗷

#include<bits/stdc++.h>
#define int long long
using namespace std;

char a[505];
char b[505];

int n;
vector<int>ans;
int num=1;

void fun(){
    cout<<b<<endl;
    while(next_permutation(b,b+n)){
        printf("%s\n",b);
        num++;
    }
}
signed main(){
    cin>>n;
    scanf("%s",a);
    sort(a,a+n);
    strcpy(b,a);
    fun();
    cout<<num<<endl;
}

问题 B: 字符序列

题目描述

从三个元素的集合[A,B,C]中选取元素生成一个 N 个字符组成的序列,使得没有两个相邻字的子序列(子序列长度=2)相同。例:N = 5 时 ABCBA 是合格的,而序列 ABCBC与 ABABC 是不合格的,因为其中子序列 BC,AB 是相同的。
对于由键盘输入的 N(1<=N<=12),求出满足条件的 N 个字符的所有序列和其总数。

输入

4

输出

72

dfs咯,注意边界,dfs讨厌没有边界感的人!!!

那么,什么是边界呢?

当然就是长度大于等于n辣,还有嗷,长度大于等于3的时候,得判断符不符合条件才能push进去!不要随便就crush,dfs会抗拒的捏~

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n;
int ans=0;
vector<int>a;

void dfs(){
    if(a.size()>=n){
        ans++;
        return;
    }
    for(int i=1;i<=3;i++){
        if(a.size()<3){
            a.push_back(i);
        }
        else{
            if(a[a.size()-1]==a[a.size()-3]&&a[a.size()-2]==i){
                continue;
            }
            else{
                a.push_back(i);
            }
        }
        dfs();
        a.pop_back();
    }
}
signed main(){
    cin>>n;
    a.clear();
    dfs();
    cout<<ans<<endl;
}

问题 C: 自然数的拆分问题

题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。

当n=7共14种拆分方法:

7=1+1+1+1+1+1+1

7=1+1+1+1+1+2

7=1+1+1+1+3

7=1+1+1+2+2

7=1+1+1+4

7=1+1+2+3

7=1+1+5

7=1+2+2+2

7=1+2+4

7=1+3+3

7=1+6

7=2+2+3

7=2+5

7=3+4

样例输入 

7

样例输出 

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

提示

2=<n<=10

哈哈,和上一题很像捏,还是注意边界感就行辣

边界是什么?

和等于n就输出,和大于n直接return

注意咯,是个递增序列!所以我们不是从1开始,而是从t开始

t是什么?

哈哈,我也说不清,自己悟吧哈哈哈

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n;
vector<int>a;
int num;

void dfs(int t){
    if(num==n){
        cout<<a[0];
        for(int i=1;i<a.size();i++){
            cout<<"+"<<a[i];
        }
        cout<<endl;
        return ;
    }
    else if(num>n){
        return ;
    }
    for(int i=t;i<n;i++){
        a.push_back(i);
        num+=i;
        dfs(i);
        num-=i;
        a.pop_back();
    }
}

signed main(){
    cin>>n;
    dfs(1);
}

问题 D: 数字三角形问题,《算法入门经典》P259,动态规划,刘丽萍,CCF六级

题目描述

下图给出了一个数字三角形,请编写一个程序,计算从顶至底的某处的一条路径,使该路径所经过的数字的总和最大。 
(1)每一步可沿左斜线向下或右斜线向下 
(2)1 < 三角形行数 < 100 
(3)三角形数字为0,1,…99 

输入

有很多个测试案例,对于每一个测试案例, 通过键盘逐行输入,第1行是输入整数(如果该整数是0,就表示结束,不需要再处理),表示三角形行数n,然后是n行数

输出

输出最大值。

样例输入 

5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5

样例输出 

30

呼呼,这是一个隐藏的动态规划,找到转移方程就好啦

转移方程是什么?

当然是:dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i-1][j-1]);

然后就没了。。。

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n;
int a[105][105];
int dp[105][105];

void fun(){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=i;j++){
            dp[i][j]=a[i][j]+max(dp[i-1][j],dp[i-1][j-1]);
        }
    }
    int max=0;
    for(int i=1;i<=n;i++){
        if(max<dp[n][i]){
            max=dp[n][i];
        }
    }
    cout<<max<<endl;
}

signed main(){
    while(cin>>n){
        for(int i=1;i<=n;i++){
            for(int j=1;j<=i;j++){
                cin>>a[i][j];
            }
        }
        fun();
    }
}

问题 E: 最大间隙问题

题目描述

给定n个实数X1,X2,X3...Xn,求这n个数在实轴上相邻两个数之间的最大差值。

输入

输入有两行,第一行为n(0<n<=300000),第二行为n个实数,实数范围在-100000000-100000000

输出

输出为两个相邻实数间的最大差值

样例输入 

5
2.3 3.1 7.5 1.5 6.3

样例输出 

3.2

 呼呼,这里偷鸡,直接用set,哈哈哈,我记着正规写法是分治来着?

忘了,管他呢,能过就行,呼呼文章来源地址https://www.toymoban.com/news/detail-434180.html

#include<bits/stdc++.h>
#define int long long
using namespace std;

int n;
set<double>a;

signed main(){
    cin>>n;
    for(int i=0;i<n;i++){
        double temp=0;
        scanf("%lf",&temp);
        a.insert(temp);
    }
    double ans=0;
    auto it = a.begin();
    auto pre=it;
    it++;
    for(;it != a.end();it++){
        double num=*it - *pre;
        if(num>ans){
            ans=num;
        }
        pre=it;
    }
    cout<<ans<<endl;
}

到了这里,关于Contest3111 - 计科2101~2104算法设计与分析上机作业07的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【多元统计分析】主成分分析——SPSS上机实验【过程+结果分析】

    【多元统计分析】主成分分析——SPSS上机实验【过程+结果分析】

    题目来自何晓群《多元统计分析》(第五版)例题5-3 试利用主成分综合评价全国各地区水泥制造业规模以上企业的经济效益,原始数据来 源于2014 年《中国水泥统计年鉴》,如表5一5所示。 掌握主成分分析的使用方法,提取主成分,计算主成分得分及综合得分。 一、标准化

    2024年02月05日
    浏览(19)
  • 一位计科学长写给 2023 级计算机类和人工智能专业的同学们的程序设计入门指南

    一位计科学长写给 2023 级计算机类和人工智能专业的同学们的程序设计入门指南

    本指南内容较多,但你们若能耐心读完,你们将收获很多…… 欢迎访问作者的主页:Xi Xu’s Home Page 什么是程序设计和程序设计语言? 程序设计 1 (programming),或称编程,是给程序解决出特定问题的过程,软件开发过程中的重要步骤。程序设计方法往往以某种程序设计语言

    2024年02月16日
    浏览(14)
  • 计算机专业考研复试上机算法学习

    计算机专业考研复试上机算法学习

    这篇博客是博主在准备可能到来的线下上机复试基于王道机试指南的学习,将各道习题链接和代码记录下来,这篇博客权且当个记录。 ps:如果想咨询华南理工大学计算机考研复试的可以CSDN上私聊我,其他学校的我可以尝试?可以交个朋友 1.1 vector动态数组 vector是C加加语言中

    2023年04月09日
    浏览(12)
  • 【机器学习】机器学习上机作业聚类算法

    自编代码实现C均值聚类和FCM聚类,在“IRIS数据集(鸢尾花数据集)”上进行实验,验证所编代码是否正确,并计算准确率。 Iris鸢尾花数|据集:包含花萼长度、花萼宽度、花瓣长度、花瓣宽度四个属性,用于预测鸢尾花种类,标签0、1、2分别表示山鸢尾、变色鸢尾、维吉尼亚鸢

    2024年01月22日
    浏览(11)
  • Java程序设计2023-第三次上机练习

    这次的练习主要是一些类的高阶操作,像继承、接口和内部类这些,但其实还是挺简单的   目录 7-1 jmu-Java-03面向对象基础-04-形状-继承 前言 本题描述 思考 输入样例: 输出样例:  7-3 jmu-Java-04面向对象进阶-03-接口-自定义接口ArrayIntegerStack main方法说明 思考 输入样例 输出样例

    2024年02月05日
    浏览(29)
  • 上机实验四 哈希表设计 西安石油大学数据结构

    (1)实验目的:掌握哈希表的设计方法及其冲突解决方法。 (2)主要内容: 已知一个含有10个学生信息的数据表,为学生“姓名”的拼音,给出此表的一个哈希表设计方案。 要求: 1)建立哈希表:要求哈希函数采用除留余数法,解决冲突方法采用链表法。 2)编写

    2024年02月05日
    浏览(11)
  • 上机实验二 设计单循环链表 西安石油大学数据结构

    上机实验二 设计单循环链表 西安石油大学数据结构

    (1)实验目的:掌握线性表的链式存储结构;掌握单循环链表及其基本操作的实现。 (2)主要内容:实现单循环链表的初始化、求数据元素个数、插入、删除、取数据元素等操作;用插入法建立带头结点的单循环链表;设计一个测试主函数验证所设计单循环链表的正确性。 掌握线性

    2024年02月07日
    浏览(12)
  • 算法设计与分析--迭代算法

    算法设计与分析--迭代算法

    一、迭代算法简介 二、设计工作步骤 三、迭代--递推法 题目及运行 四、迭代--倒推法 题目及运行 五、总结 算法语言--C语言 迭代算法也称 “辗转法” ,是一种不断用变量的 旧值递推出新值 的解决问题的方法。 迭代算法一般用于数值的计算,是读者早就熟悉的一种算法策

    2024年02月09日
    浏览(12)
  • 【算法分析与设计】算法概述

    【算法分析与设计】算法概述

    数据结构+算法(+设计模式)=程序   理解算法的概念。   掌握算法的计算复杂性概念。   掌握算法复杂性的渐近性态的数学表述。   了解NP类问题的基本概念。   顾名思义,计算(求解)的方法   算法(Algorithm):对特定问题求解步骤的一种描述,是 指令的有

    2024年02月07日
    浏览(6)
  • 算法设计与分析之贪心算法

    贪心算法(Greedy Algorithm)是一种基于贪心思想的算法策略。它通过每一步选择当前状态下最优的解决方案,从而逐步得到全局最优解。贪心算法通常在问题具有 贪心选择性质 和 最优子结构性质 时被应用。 贪心算法的基本思想是,每一步选择当前情况下看起来最好的解决方

    2024年02月11日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包