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

还在为数学建模的事发愁?带你一起来看看数模竞赛中必备的经典算法 数学建模比赛是本科生和研究生阶段最重要的比赛之一,包括全国大学生数学建模竞赛(俗称“国赛”)和美国大学生数学建模竞赛(俗称“美赛”)。在这些比赛中取得好成绩,不仅有助于保研、有助于找工作,更重要的是形成科学的思维模式。下面列举了十大算法,在数学建模竞赛中有着无比广泛而重要的应用。 01 蒙特卡罗算法 1946 年,美国拉斯阿莫斯国家实验室的三位科学家 JohnvonNeumann, Stan Ulam和 Nick Metropolis 共同发明了蒙特卡罗方法。 蒙特卡罗方法(Monte... 阅读详情
// 程序2-2 7744问题(1)
#include <stdio.h>
#include <math.h>
int main(void)
{
    int a, b, n;
    double m;
    for(a = 1; a <= 9; a++)
        for(b = 0; b <= 9; b++){
            n = a*1100 + b*11;
            m = sqrt(n);
            if(floor(m+0.5) == m)    // 判断整数需要它和它的整数部分比较
                printf("%d\n", n);
        }
    return 0;
}

// 程序2-3 7744问题(2)
#include <stdio.h>
int main(void)
{
    int x, n, hi, lo;
    for(x = 1; ; x++){
        n = x * x;
        if(n < 1000)
            continue;
        if(n > 9999)
            break;
        hi = n / 100;
        lo = n % 100;
        if(hi/10==hi%10 && lo/10==lo%10)
            printf("%d\n", n);
    }
    return 0;
}

// 程序2-4 3n+1问题
#include <stdio.h>
int main(void)
{
    int n, count=0;
    scanf("%d", &n);
    while(n > 1)
    {
        if(n%2==1)
            n = n*3+1;
        else
            n /= 2;
        count++;
    }
    printf("%d\n", count);
    return 0;
}

// 程序2-5 阶乘之和(1)
#include <stdio.h>
int main(void)
{
    int i, n, fac, S;
    scanf("%d", &n);
    for(i = 1, fac = 1, S = 0; i <= n; i++){
        fac *= i;
        S += fac;
    }
    printf("%d\n", S%1000000);
    return 0;
}

// 程序2-6 阶乘之和(2)
#include <stdio.h>
#include <time.h>
int main(void)
{
    const int MOD = 1000000;
    int i, n, s, fac;
    scanf("%d", &n);
    if(n > 25) n = 25; // 通过实验得出规律
    for(i = 1, fac = 1, s = 0; i <= n; i++){
        fac = fac * i % MOD;
        s = (s + fac) % MOD;
    }
    printf("%d\n", s);
    printf("%.2f\n", (double)clock() / CLOCKS_PER_SEC);
    return 0;
}

// 程序2-8 数据统计(重定向版)
#define LOCAL
#include <stdio.h>
#define INF 100000000
int main(void)
{
#ifdef LOCAL
    freopen("in.txt", "r", stdin);
    freopen("out.txt", "w", stdout);
#endif // LOCAL
    int x, n = 0, s = 0, min = INF, max = -INF;
    while(scanf("%d", &x) == 1){
        s += x;
        if(x < min)
            min = x;
        if(x > max)
            max = x;
        // printf("x=%d, min=%d, max=%d\n", x, min, max);
        // “输出中间结果”调试
        n++;
    }
    printf("%d %d %.3f\n", min, max, (double)s/n);
    return 0;
}

// 程序2-9 数据统计(fopen版)
#include <stdio.h>
#define INF 100000000
int main(void)
{
    FILE *fin, *fout;
    fin = fopen("in.txt", "r");
    fout = fopen("out.txt", "w");
    int x, n = 0, s = 0, min = INF, max = -INF;
    while(fscanf(fin, "%d", &x) == 1){
        s += x;
        if(x < min)
            min = x;
        if(x > max)
            max = x;
        n++;
    }
    fprintf(fout, "%d %d %.3f\n", min, max, (double)s/n);
    fclose(fin);
    fclose(fout);
    return 0;
}

// C++重定向版
#include <fstream>
using namespace std;
ifstream fin("in.txt");
ofstream fout("out.txt");
int main(void)
{
	int a, b;
	while(fin >> a >> b)
		fout << a+b << endl;
	return 0;
}

// 习题2-1 位数(digit)
#include <stdio.h>
int main(void)
{
	int n, digit = 0;
	scanf("%d", &n);
	while(n){
		digit++;
		n /= 10;
	}
	printf("%d\n", digit);
	return 0;
}

// 习题2-2 水仙花数(daffodil)
#include <stdio.h>
int main(void)
{
	int x, y, z, i;
	for(i = 100; i <= 999; i++){
		x = i / 100;
		y = i / 10 % 10;
		z = i % 10;
		if (x*x*x + y*y*y + z*z*z == i)
			printf("%d\n", i);
	}
	return 0;
}

// 习题2-3 韩信点兵(hanxin)
#include <stdio.h>
int main(void)
{
	int a, b, c, i;
	scanf("%d%d%d", &a, &b, &c);
	for(i = 10; i <= 100; i++)    // 逆向思维
		if(i%3==a && i%5==b && i%7==c){
	 		printf("%d\n", i);
	 		break;
	 	}
	if(i == 101)
	 	printf("No answer\n");
	return 0;
}

// 习题2-4 倒三角形(triangle)
#include <stdio.h>
int main(void)
{
	int a, b, x, i;
	scanf("%d", &x);
	for(a = x; a >= 1; a--){
	 	for(i = 1; i <= 40-a; i++)
	  		printf(" ");
	 	for(b = 1; b <= 2*a-1; b++)
	  		printf("#");
	 	printf("\n");
	}
	return 0;
}

// 习题2-5 统计(stat)
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    FILE *fin,*fout;
    fin=fopen("in.txt","rb");
    fout=fopen("out.txt","wb");
    int n,m;
    scanf("%d",&n);
    int *a=(int*)malloc(sizeof(int)*n);
    for(int i=0;i<n;i++)
        fscanf(fin,"%d",&a[i]);
    fscanf(fin,"%d",&m);
    int count=0;
    for(int i=0;i<n;i++)
        if(a[i]<m)
            count++;
    fprintf(fout,"%d",count);
    free(a);
    fclose(fin);
    fclose(fout);
    return 0;
}

// 习题2-6 调和级数(harmory)
#include <stdio.h>
int main(void)
{
	int n, i;
	double sum = 0;
	scanf("%d", &n);
	for(i = 1; i <= n; i++)
		sum += 1.0/i;
	printf("%.3f\n", sum);
	return 0;
}

// 习题2-7 近似计算(opproximation)
#include <stdio.h>
int main(void)
{
	int i = 1;
	double pi = 0, t = 1, x = 1;
	while (t >= 1e-6)
	{
	 	pi += x*t;
	 	i += 2;
	 	x = -x;
	 	t = 1.0 / i;
	}
	printf("%f\n", 4*pi);
	return 0;
}

// 习题2-8 子序列的和(subsequence)
#include <stdio.h>
int main(void)
{
    int n, m, i;
    double sum = 0;
    scanf("%d%d", &n, &m);
    for(i = n; i <= m; i++)
        sum += 1.0/i/i; // 不要写成sum += 1.0/(i*i),否则会溢出
    printf("%.5f\n", sum);
    return 0;
}

// 习题2-9 分数化小数(decimal)
#include <stdio.h>
int main(void)
{
	int a, b, c;
	scanf("%d%d%d", &a, &b, &c);
	printf("%.*f\n", c, 1.0*a/b);
	return 0;
}

// 习题2-10 排列(permutation)
#include <stdio.h>
int main(void)
{ // 直接“翻译”题目
    int a,b,c,d,e,f,g,h,i;
    for(a=1;a<=9;a++){
    for(b=1;b<=9;b++){
    for(c=1;c<=9;c++){
    for(d=1;d<=9;d++){
    for(e=1;e<=9;e++){
    for(f=1;f<=9;f++){
    for(g=1;g<=9;g++){
    for(h=1;h<=9;h++){
    for(i=1;i<=9;i++){
    if ((2*(a*100+b*10+c)==(d*100+e*10+f))&&(3*(a*100+b*10+c)==(g*100+h*10+i))&&
        (a!=b)&&(a!=c)&&(a!=d)&&(a!=e)&&(a!=f)&&(a!=g)&&(a!=h)&&(a!=i)&&(b!=c)&&
        (b!=d)&&(b!=e)&&(b!=f)&&(b!=g)&&(b!=h)&&(b!=i)&&(c!=d)&&(c!=e)&&(c!=f)&&
        (c!=g)&&(c!=h)&&(c!=i)&&(d!=e)&&(d!=f)&&(d!=g)&&(d!=h)&&(d!=i)&&(e!=f)&&
        (e!=g)&&(e!=h)&&(e!=i)&&(f!=g)&&(f!=h)&&(f!=i)&&(g!=h)&&(g!=i)&&(h!=i))
        printf("%d,%d,%d\n",a*100+b*10+c,d*100+e*10+f,g*100+h*10+i);}}}}}}}}} 
    return 0;
}

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

相关推荐

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

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

weixin_42575505的博客 782

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

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

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

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

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

weixin_28931507的博客 1163

【C语言】随机数生成以及`#include <time.h>`学习

目录 一、随机数生成 二、#include 头文件 三、一些碎碎念 一、随机数生成 1.伪随机数【rand函数的应用】 函数功能:可以随机产生0~rand_max的随机数,定义类型不同,最大值也不相同。 头文件:#include <stdlib.h> 之所以叫做伪随机数,是因为根据一个数按照某个公式推算出来的,有很大概率会多次产生同一个数。 #include <stdio.h> #include <stdlib.h> int main...

moteandsunlight的博客 5905

算法竞赛入门到进阶 课件+源码

算法竞赛入门到进阶 课件+源码,超值。

算法实践

编码实践 编码问题

C语言实现钟表,年月日时分秒实时更新。(后附函数使用方法)

很简单的一个小程序!为了便于交流,我没有省略步骤。(后附函数使用方法) 库文件为: #include<stdio.h> #include<windows.h> #include<time.h> #include<stdio.h> #include<windows.h> #include<time.h> int main() {...

玫瑰花店的博客 6038

刘汝佳《算法竞赛入门经典——训练指南》源代码

《算法竞赛入门经典——训练指南》代码仓库 限于篇幅,书上并没有给出所有例题的代码,这里给出了所有例题的代码,并且改进了书上的一些代码。

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

算法竞赛入门经典(第一章)源代码 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

publisher与subscriber话题的消息类型md5sum不一致问题

[ERROR] [1604235557.591296096]: Client [/range_vision_fusion_01] wants topic /detection/vision_objects to have datatype/md5sum [autoware_msgs/DetectedObjectArray/13415342e539aa36ea9a6f04ffaf39b4], but our version has [autoware_msgs/DetectedObjectArray/c16a

cxhmike的博客 6620

3D数学-动力学

3D数学-11-动力学 旋转运动学 二维旋转动力学 首先我们考虑最简单的情况: 我们将F施加在圆盘(忽略质量)上的一个点(质量为m)上 图中:F为我们施加的力,O是枢轴原点。 通过基本的运算,我们可以得到 F'= F*sinθ 那么切向加速度 a = F'/ m 切向加速度是线性速度的加速度,我们通过除以半径获得角加速度 α = a / r 现在,我们换一种方式,那就是通过杠杆臂的方式去施加力 为了能够计算出m点的角加速度,我们需要引入一个概念:扭矩 他的理解类似于力矩,公式如下 τ = Flsi

韩天衣的博客 2285

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

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

TanAp0k 1096

高频面波成像实战:从频散曲线到全波形反演

面波勘探是近地表工程勘察的重要手段,其核心原理在于不同频率的面波对地下介质的敏感深度不同,由此形成的频散曲线能够反映浅层剪切波速结构。相较于传统钻探与折射波法,高频面波成像具有无损、高效、对低速夹层敏感等优势,广泛应用于路基检测、空洞探测、滑坡调查等领域。在实际工程中,从野外采集的排列设计、震源选型,到频散谱提取与频散曲线反演,每一步都直接影响成像精度。然而频散反演受限于一维层状假设,难以刻画横向剧烈变化的地质体。全波形反演通过拟合完整波形信息,能够突破频散曲线的分辨率边界,获得更精细的近地表速度模型。本文

weixin_29090917的博客 270

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

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

小白兔奶糖の博客 3891

Cadence Virtuoso实战:NMOS差分放大器设计与SPICE仿真全解析

本文详细解析了使用Cadence Virtuoso设计NMOS差分放大器并进行SPICE仿真的全流程。从基础设计要点、原理图绘制到工作点分析与性能调优,提供了实用的设计技巧和常见问题解决方案,帮助工程师高效完成模拟集成电路设计。重点介绍了差分放大器的关键参数设置、饱和区优化及版图设计注意事项,适用于ADC、DAC等高性能电路开发。

weixin_28340315的博客 611

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目

【中国大学生计算机设计大赛信息可视化赛道】国奖项目深入剖析—中国古代奇异怪兽移动端可视化应用项目 注:本文主要目的是对于往年国奖项目案例-可视化项目的深入剖析讲解,对源码、项目特点、要点、特色继续深入分析。帮助大家学习技术,掌握规律。

一键难忘的博客 3730

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

算法竞赛入门经典    第三章与源代码 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

抖音移动端Web用户主页视频列表爬虫实战:逆向加密参数与高频采集方案

App端Hook/抓包:需要安卓逆向、Xposed或Frida,门槛高且容易被风控。官方开放API:限制极多,几乎不开放用户级视频列表。PC端Web:页面加载方式繁杂,且大量依赖懒加载与内部状态。移动端Web(:接口相对稳定,加密逻辑集中,且适合使用Requests/HTTPSession模拟,无需渲染引擎。本文聚焦于移动端Web下的用户主页视频列表爬取,采用Python 3.11 + httpx + PyExecJS + 正则/JSON解析的组合,破解X-Bogus签名和_signature。

2201_76125261的博客 855

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

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

程序人生 1903

第23章:代码迁移——用AI将Vue2迁移到Vue3、将JS迁移到TS

> - 用AI自动将Vue2 Options API转为Vue3 Composition API的完整流程 > - 将JavaScript项目批量迁移到TypeScript,自动添加类型推导 > - 处理依赖冲突、破坏性变更和迁移后的验证方法 > - 一个完整的Vue2到Vue3迁移案例(含路由、状态管理) > - 我如何用AI将公司一个10万行代码的老项目从JS升级到TS

sfishfly的博客 208

无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案

本文主要介绍了无法将“choco”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方案,希望能对使用wIndows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 12万+

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

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

GitChat 5701

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

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

// 程序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

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

刘汝佳《算法竞赛入门经典(第二版)》第四章习题(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

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

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

// 程序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、付费专栏及课程。

余额充值