算法竞赛入门经典-第三章源代码

算法竞赛入门经典笔记—第三章 用语句“int a[maxn]”声明一个包含maxn个整型变量的数组,即a[0],a[1],…,a[maxn-1],但不包含a[maxn]。maxn必须是常数,不能是变量。 n++先计算表达式,再将n加1; ++n先将n加1,再计算表达式。 ... 阅读详情
// 程序3-1 逆序输出
#include <stdio.h>
#define MAXN 100+10 // 保险
int a[MAXN]; // 比较大的数组应尽量声明在main函数外
int main(void)
{
    int i, x, n=0;
    while(scanf("%d", &x)==1)
        a[n++] = x;
    for(i = n-1; i >= 1; i--)
        printf("%d ", a[i]);
    printf("%d\n", a[0]); // 输出n个整数只需要n-1个空格,所以分两行输出
    return 0;
}

// 程序3-2 开灯问题
#include <stdio.h>
#include <string.h>
#define MAXN 1000 + 10
int a[MAXN]; // 数组模拟操作
int main(void)
{
    int i, j, n, k, first = 1;
    memset(a, 0, sizeof(a));
    scanf("%d%d", &n, &k); // 两个循环位置可以互换
    for(i = 1; i <= k; i++) // 遍历每个人
        for(j = 1; j <= n; j++) // 分析每盏灯
            if(j%i == 0)
                a[j] = !a[j];
    for(i = 1; i <= n; i++)
        if(a[i])
        {
            if(first) first = 0; // 避免输出多余空格
            else printf(" ");
            printf("%d", i);
        }
    printf("\n");
    return 0;
}

// 程序3-3 蛇形填数
#include <stdio.h>
#include <string.h>
#define MAXN 20
int a[MAXN][MAXN];
int main(void)
{
    int n, x, y, tot = 0;
    scanf("%d", &n);
    memset(a, 0, sizeof(a));
    tot = a[x=0][y=n-1] = 1; // 简洁高效 
    while(tot < n*n){ // 预判(越界或已填)并填入 // &&短路运算符保证不越界
        while(x+1<n && !a[x+1][y]) a[++x][y] = ++tot;
        while(y-1>=0 && !a[x][y-1]) a[x][--y] = ++tot;
        while(x-1>=0 && !a[x-1][y]) a[--x][y] = ++tot;
        while(y+1<n && !a[x][y+1]) a[x][++y] = ++tot;
    } // 使用++i不影响后面的数据
    for(x = 0; x < n; x++){
        for(y = 0; y < n; y++)
            printf("%5d", a[x][y]);
        printf("\n");
    }
    return 0;
}

// 程序3-4 竖式问题
#include <stdio.h>
#include <string.h>
int main(void)
{
    int i, ok, abc, de, x, y, z, count = 0;
    char s[20], buf[100];
    scanf("%s", s); // 用字符串存放整数,便于利用字符串函数
    for(abc = 111; abc <= 999; abc++) // 先穷举abc/de,后剔除不符合的
        for(de = 11; de <= 99; de++){ // 为什么从11/111开始?
            x = abc*(de%10);
            y = abc*(de/10);
            z = abc*(de);
            sprintf(buf, "%d%d%d%d", abc, de, x, y, z); // 创建“集合”
            ok = 1; // printf输出到屏幕,fprintf输出到文件,sprintf输出到字符串
            for(i = 0; i < strlen(buf); i++)
                if(strchr(s, buf[i]) == NULL) // “属于关系”
                    ok = 0;
            if(ok){
                printf("<%d>\n", ++count);
                printf("%5d\nX%4d\n-----\n%5d\n%4d\n-----\n%5d\n\n",
                       abc, de, x, y, z);
            }
        }
    printf("The number of solutions = %d\n", count);
    return 0;
}

// 程序3-5 最长回文子串(1)
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 判断字符属性,转换字符
#define MAXN 5000+10
char buf[MAXN], s[MAXN];
int main(void)
{
    int i, j, k, ok, n, m=0, max=0;
    fgets(buf, sizeof(s), stdin);
    n = strlen(buf);
    for(i = 0; i < n; i++)
        if(isalpha(buf[i]))
            s[m++] = toupper(buf[i]);
    for(i = 0; i < m; i++)
        for(j = i; j < m; j++){ // 枚举所有子串(首i->尾j)
            ok = 1; // "判断题"
            for(k = i; k<=j&&ok!=0; k++)
                if(s[k] != s[i+j-k]) // 判断回文串
                    ok = 0;
            if(ok && j-i+1>max)
                max = j-i+1;
        }
    printf("max = %d\n", max);
    return 0;
}

// 程序3-6 最长回文子串(2) // 迭代式开发
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define MAXN 5000+10
char buf[MAXN], s[MAXN];
int p[MAXN];
int main(void)
{
    int i, j, x, y, n, m = 0, max = 0;
    fgets(buf, sizeof(s), stdin); // 读入一行字符串
    n = strlen(buf);
    for(i = 0; i < n; i++) // 预处理字符串简化任务
        if(isalpha(buf[i])){
            p[m] = i; // m对应新串序号,i对应原串序号
            s[m++] = toupper(buf[i]);
        }
    for(i = 0; i < m; i++)
    { // i为中间位置,j为“半径”,注意对j的限制(由特殊例子推导一般)
        for(j=0; i-j>=0&&i+j<m; j++){// 奇数序列
            if(s[i-j] != s[i+j])
                break;
            if(j*2+1 > max){
                max = j*2+1; // 记录当前最大值
                x = p[i-j]; // 记录原串起始(结束)位置
                y = p[i+j];
            }
        }
        for(j=0; i-j>=0&&i+j+1<m; j++){// 偶数序列
            if(s[i-j] != s[i+j+1])
                break;
            if(j*2+2 > max){
                max = j*2+2;
                x = p[i-j];
                y = p[i+j+1];
            }
        }
    }
    for(i = x; i <= y; i++)
        printf("%c", buf[i]);
    printf("\n");
    return 0;
}

// 习题3-1 分数统计(stat)
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
    int a[101], n; // 用数组记录次数
    memset(a, 0, sizeof(a));
    while(cin >> n)
        ++a[n];
    int max = a[0];
    for(int i = 1; i < 101; ++i)
        if(a[i] > max)
            max = a[i];
    for(int i = 0; i < 101; ++i)
        if(a[i] == max)
            cout << i << " ";
    return 0;
}

// 习题3-1 分数统计(stat)
#include <iostream>
#include <algorithm> // 重要
#include <cstring>
using namespace std;
const int MAXN = 1000+10;

bool cmp(double a, double b)
{
    return 100*a<100*b;
}

int main(void)
{
    int a[MAXN];
    double mark[MAXN];
    memset(a, 0, sizeof(a));
   
    int n = 0;
    while(cin >> mark[n++]); // 记录数据及数目
    sort(mark, mark+n, cmp); // 排序预处理
   
    int cnt = 1;
    for(int i = 1; i < n; i++){ // 记录mark次数
        if(100*mark[i] == 100*mark[i-1]) // 为什么后面的与前面的比较?考虑最后一个数!
            cnt++;
        else{
            a[i-1] = cnt; // 标记到最后一个相同的数
            cnt = 1;
        }
    }
    a[n-1] = cnt;

    int max = a[0];
    for(int i = 1; i < n; i++) // 寻找最大次数
        if(a[i] > max)
            max = a[i];

    for(int i = 0; i < n; i++) // 从小到大依次输出
        if(a[i] == max)
            cout << mark[i] << " ";
   
    return 0;
}

// 习题3-2 单词的长度(word)
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
    string line;
    int cnt, word;
    cnt = word = 0;
    while(cin >> line){
        ++word;
        cnt += line.size();
    }
    cout << 1.0*cnt/word << endl;
    return 0;
}

// 习题3-3 乘积的末3位(product)
#include <iostream>
using namespace std;

int main(void)
{
    int cheng, ge, shi, bai, n;
    cheng = 1;
    while(cin >> n){
        ge = cheng*(n%10);
        shi = 10*cheng*((n/10)%10);
        bai = 100*cheng*(n/100);
        cheng = ge + bai + shi;    // “小学生”算术
        cheng %= 1000;
    }
    cout << cheng << endl;
    return 0;
}

// 习题3-4 计算器(calculator)
#include <cstdio>
#include <iostream>
using namespace std;
const int MAXN = 100+10;

int main(void)
{
    char word[MAXN];
    int a, b, i;
    char c;
    while(1){
        i = 0;
        while(c=getchar(), c!='\n') // 巧用逗号运算符
            if(c!=' ' && c!='\t')
                word[i++] = c;
        sscanf(word, "%d%c%d", &a, &c, &b);
        switch(c){
            case '+': cout << a+b << endl; break;
            case '-': cout << a-b << endl; break;
            case '*': cout << a*b << endl; break;
        }
    }
    return 0;
}

// 习题3-5 旋转(rotate)
#include <iostream>
#define MAXN 10
using namespace std;

char s[MAXN][MAXN];
int main(void)
{
    int n;
    cin >> n;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
         cin >> s[i][j];
            cout << s[i][j] << " ";
        }
        cout << endl;
    }

    for(int j=n-1; j>=0; j--){
        for(int i=0; i<=n-1; i++)
            cout << s[i][j] << " ";
        cout << endl;
    }
    return 0;
}

// 习题3-6 进制转换1(base1)
#include <iostream>
#include <cstring>
using namespace std;

int main(void)
{
    int n, b, i, a[100];
    while(cin >> n >> b){
        i = 0;
        memset(a, 0, sizeof(a));
        while(n != 0)
        {
            a[i++] = n % b;
            n /= b;
        }
        for(int j=i-1; j>=0; j--)
            cout << a[j];
        cout << endl;
    }
    return 0;
}

// 习题3-7 进制转换2(base2)
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

const int MAXN = 5000+10;
int main(void)
{
    int a[MAXN], b, n;
    while(cin >> b >> n)
    {
        int cnt = 0;
        memset(a, 0, sizeof(a));
        while(n)
        {
            a[cnt++] = n%10;
            n /= 10;
        }
        int sum = 0;
        for(int i = 0; i < cnt; ++i)
            sum += a[i]*pow(b, i);
        cout << sum << endl;
    }
    return 0;
}

// 习题3-8 手机键盘(keyboard)
#include <iostream>
#include <string>
#include <cstdlib>
using namespace std;

int main(void)
{
    string word;
    while(cin >> word){
        for(int i = 0; i < word.size(); ++i){
            int t = (word[i]-'a'+1)%3;
            if(abs(word[i]-word[i-1]) < 3 && i != 0)
                cout << word[i-1] << (t?t:3);
            else
                cout << word[i] << (t?t:3);
        }
        cout << endl;
    }
    return 0;
}

还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法 数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称“国赛”)和美国大学生数学建模竞赛(俗称“美赛”)。在这些比赛中取得好成绩,不仅有助于保研、有助于找工作,更重要的是形成科学的思维模式。下面列举了十大算法,在数学建模竞赛中有着无比广泛而重要的应用。 01 蒙特卡罗算法 1946 年,美国拉斯阿莫斯国家实验室的三位科学家 JohnvonNeumann, Stan Ulam和 Nick Metropolis 共同发明了蒙特卡罗方法。 蒙特卡罗方法(Monte... 阅读详情

相关推荐

GITHUB 上的算法竞赛平台

目录算法竞赛平台上的探索探索的开始begin1. CodingGameServer2.Machine learning competition platform3.codalab-competitions4.FirstToSolve5.360Constest6.Sapporo7.software for SamurAI Coding 2017-188.DMOJ: Modern Online Judge9.moolinet10.CodeOJ11.juding12.malvo13.DOMjudge14.cms总

single7_的博客 1894

【无标题】

int n;num++;x = next_x;y = next_y;} else {i < n;i++) {j < n;j++) {return 0;

CQY0531的博客 416

ACM竞赛源代码集:C语言算法实现

ACM国际大学生程序设计竞赛(ACM-ICPC)是一项面向全球大学生的计算机程序设计竞赛,它不仅考察参赛者的算法与编程能力,还强调团队协作精神。ACM竞赛对于提升IT专业人士的技能和知识面有重要意义。实战案例的解析有助于我们更好地理解解题策略的构建过程。

weixin_32535825的博客 1327

那些老师最喜欢考的PTA题目

函数接口定义:int FindArrayMax( int a[], int n );本题要求实现一个找出整型数组中最大值的函数。/* 请在这里填写答案 */

2301_79069303的博客 233

算法竞赛实战:从入门到精通

htmltable {th, td {th {pre {简介:掌握高效编程技巧和算法对于参与算法竞赛至关重要。通过在实践项目中编写代码,理解并巩固《算法竞赛入门经典》一书中的算法知识,有助于提高解题能力和应对编程比赛。本项目基于C++语言,按照算法问题类别组织源代码,涵盖了基础数据结构、排序与搜索、动态规划、贪心算法、回溯法与分支限界、图论算法、字符串处理、计算几何、数学知识及效率优化等多个算法竞赛中的关键知识点。

weixin_42575505的博客 782

刘汝佳《算法竞赛入门经典——训练指南》完整源码解析与实战

0-1背包的状态定义非常经典:dp[i][j]= 考虑前i个物品,重量不超过j时的最大价值这个定义妙在哪里?它把“选择决策”转化成了“状态转移”:左边是“不拿”,右边是“拿”。只要你会递推,就能填表。但空间 $O(nW)$ 有点吃紧。怎么办?滚动数组!观察发现:当前行只依赖上一行。于是我们可以压缩成一维:for j in range(W, w[i]-1, -1): # 逆序更新逆序是为了防止同一物品被重复选取(完全背包则正序)。

weixin_28931507的博客 1163

12周作业

第一题: 实现如下格式的函数,以查找整数序列中的最大值和最小值: void max_min(int a[], int n, int *max, int *min); 在主程序中,从键盘分两行输入数据,第一行为整数序列的个数(不超过20个),第二行为该整数序列,可由空格或制表符\t分隔。最后打印最大值和最小值,用逗号分隔。 应尽可能使用指针来实现,例如循环不使用int型变量来计数,改用指针比较来完成。 输入样例: 5 -8 7 22 5 13 输出结果: 22,-8 就是比较大小然后替

balabakaka的博客 475

C++常见面试题总结

C++常见面试题总结

xu_fu_yong的专栏 8万+

算法竞赛入门经典(第三章)源代码

算法竞赛入门经典    第三章与源代码 3-1 #include #define MAXN 100 + 10 int a[MAXN]; int main(){ int i, x, n = 0; while(scanf("%d", &x) == 1) a[n++] = x; for(i = n-1; i >= 1; i--) printf("%d ", a[i]);

69小石头的博客 1276

PyCharm 2023最新版安装配置全攻略(附永久激活教程)

本文详细介绍了PyCharm 2023最新版的安装配置全流程,包括版本选择、初始配置、插件生态、工程模板、调试优化及团队协作等关键步骤。特别针对专业版和社区版的功能差异进行对比,帮助开发者高效搭建Python开发环境,提升编码效率与团队协作能力。

p4q5r6s7t的博客 869

Deeplabv3+改进1:添加CBAM注意力机制|有效涨点

我们提出卷积块注意力模块(CBAM),这是一种简单而有效的前馈卷积神经网络注意力模块。给定一个中间特征图,我们的模块会依次沿两个独立维度(通道和空间)推断注意力图,然后将注意力图与输入特征图相乘,以实现自适应特征细化。由于 CBAM 是一个轻量级且通用的模块,它可以无缝集成到任何 CNN 架构中,几乎不会增加开销,并且可以与基础 CNN 一起端到端训练。我们通过在 ImageNet-1K、MS COCO 检测和 VOC 2007 检测数据集上进行的大量实验验证了 CBAM。

AIcurator的博客 1691

算法竞赛入门经典(第一章)源代码

算法竞赛入门经典(第一章)源代码 1-1 #include int main(){ printf("%d\n", 1+2); return 0; } 1-2 #include int main(){ printf("%.1lf\n", 8.0/5.0); return 0; } 1-3 #include #include int main(){ printf("%.8lf\n

69小石头的博客 1438

提示词编程在自动化内容审核中的应用

文章标题 提示词编程在自动化内容审核中的应用 关键词:提示词编程,自动化内容审核,人工智能,算法原理,系统架构设计,项目实战 摘要 本文旨在探讨提示词

AI天才研究院 1254

《算法竞赛入门经典》——刘汝佳

“构造性”和“可行性”是计算机学科的两个最根本特征。 比赛的核心是算法 #1 语言篇 编程不是看会的,也不是听会的,而是练会的,所以应尽量在计算机旁阅读书本,以便把书中的程序输入到计算机中进行调试,顺便再做做上机练习。千万不要图快—如果没有足够的时间来实践,那么学的快,忘得也快! 1.1算数表达式 原因并不重要,重要的是规范:根据规范做事情,则一切尽在掌握中。 提示1-1:整数值用%d输出,实数用%f输出。 提示1-2:整数/整数=整数,浮点数/浮点数=浮点数。 整数-浮点数=浮点数。 一般来说,.

小白兔奶糖の博客 3891

MFC实现键盘钩子(附完整源码)

MFC实现键盘钩子(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 390

贝叶斯核机回归估计混合物健康效应 【BKMR包】——实操篇

使用 ggplot2包绘制 h 的截面# 绘制总体风险摘要。

三分钟热度 5382

刘汝佳《算法竞赛入门经典(第二版)》习题(六)

刘汝佳《算法竞赛入门经典(第二版)》第四章习题(4-1~4-3) 习题4-1 象棋(Xiangai,ACM/ICPC Fuzhou 2011,UVa1589) 考虑一个象棋残局,其中红方有n(2≤n≤7)个旗子,黑方只有一个将。红方除了有一个帅(G)之外还有3种可能的棋子:车(R),马(H),炮(C),并且需要考虑“蹩马腿”与将和帅不能照面(将、帅如果同在一条直线上,中间又不隔着任何棋

程序人生 1903

工业级Modbus ASCII实时监控系统(WinForms完整实现)

本文介绍了一个基于WinForms的工业级Modbus ASCII实时监控系统实现方案。该系统采用经典工控界面布局,包含串口配置、数据采集控制和实时数据显示三大区域。核心功能包括:串口通信参数设置、Modbus从站地址配置、寄存器数据采集、实时数据表格展示和趋势图绘制。系统通过ModbusAsciiClient类实现通信核心,采用定时器轮询机制采集数据,支持最多100个数据点的历史趋势显示。界面设计注重用户体验,配置区位于左侧,主显示区在右侧,底部为状态和日志区,符合工业控制系统的操作习惯。代码示例展示了窗

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 279

高效算法:竞赛、应试与提高必修128例

内容简介 本书旨在探讨如何优化算法效率,详细阐述了经典算法和特殊算法的实现、应用技巧和复杂度验证过程,内容由浅入深,能帮助读者快速掌握复杂度适当、正确率高的高效编程方法以及自检、自测技巧,是参加 ACM ICPC、Google Code Jam 等国际编程竞赛、备战编程考试、提高编程效率、优化编程方法的参考书目。 适读人群:本书适合算法爱好者和编程人员,尤其是参加编程竞赛和考试的人员,可作为参加编...

GitChat 5701

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

0021 Ananagrams UVA - 156 算法竞赛入门经典系列源码解析

0021 Ananagrams UVA - 156 算法竞赛入门经典系列源码解析

算法竞赛入门,越专注,越成功。 214

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

算法竞赛入门经典-第一章源代码

// 程序1-7 三位数反转 (2) #include <stdio.h> int main(void) { int n, m; scanf("%d", &n); m = (n%10)*100 + (n/10%10)*10 + (n/100); printf("%03d\n", m); // 处理个位数为零的特殊情况 return 0; } // ...

abu47643的博客 211

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

刘汝佳《算法竞赛入门经典(第二版)》习题(九)

刘汝佳《算法竞赛入门经典(第二版)》第四章习题(4-9~4-10) 习题4-9 数据挖掘(Data Mining,ACM/ICPC NEERC 2003,UVa1591) 有两个n元素数组P和Q。P数组每个元素占SP个字节,Q数组每个元素占SQ个字节。有时需直接根据P数组中某个元素P(i)的偏移量Pofs(i)算出对应的Q(i)的偏移量Qofs(i)。当两个数组的元素均为连续存

程序人生 943

《算法竞赛入门经典(第2版)》代码 Chapter 2

2-1 2-2 2-3 2-4 2-5

TanAp0k 1096

算法竞赛入门经典-第四章源代码

// 程序4-1 组合数 #include <stdio.h> int f(int n) { int i, m = 1; for(i = 1; i <= n; i++) m *= i; return m; } int main(void) { int m, n; scanf("%d%d", &m...

abu47643的博客 150
上一篇: 算法竞赛入门经典-第二章源代码
下一篇: 算法竞赛入门经典-第四章源代码
yanweicode
博客等级 码龄12年 3粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值