算法竞赛进阶指南 0x70 综合技巧与实践

本文介绍了一种算法竞赛中的实战技巧,通过快速排序算法的实现与验证进行讲解。包括了暴力解法(冒泡排序)、正确解法(快速排序)、随机数据生成及对拍程序的实现。

算法竞赛进阶指南 0x70 综合技巧与实践

0x71 C++ STL

0x72 随机数据生成与对拍

NOIP 复赛 必备 能力

随机数据生成与对拍 简单实践 如下

P1177 【模板】快速排序

https://www.luogu.org/problemnew/show/P1177可提供在线测评

bf:brute force 暴力,朴素解法

bf.cpp bf.exe

//冒泡排序 暴力 枚举
#include <stdio.h>
#define maxn 100100
int a[maxn];
int main(){
    int n,i,j,t;
    freopen("data.in","r",stdin);
    freopen("data.out","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    for(i=1;i<=n;i++)//自小到大排序
        for(j=i+1;j<=n;j++)
            if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t;
    for(i=1;i<=n;i++)printf("%d ",a[i]);
    return 0;

}

sol:solution 正解 准备提交测评的程序

sol.cpp sol.exe

#include <stdio.h>
#define maxn 100100
int a[maxn];
void quicksort(int left,int right){
    int i=left,j=right,mid=a[(left+right)/2],t;
    while(i<=j){
        while(a[i]<mid)i++;
        while(a[j]>mid)j--;
        if(i<=j)t=a[i],a[i]=a[j],a[j]=t,i++,j--;
    }
    if(i<right)quicksort(i,right);
    if(left<j)quicksort(left,j);
}
int main(){
    int n,i;
    freopen("data.in","r",stdin);
    freopen("data.ans","w",stdout);
    scanf("%d",&n);
    for(i=1;i<=n;i++)scanf("%d",&a[i]);
    quicksort(1,n);
    for(i=1;i<=n;i++)printf("%d ",a[i]);
    return 0;

}

random:随机数据生成程序

random.cpp random.exe

//生成 整数 序列
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define maxn 100
#define maxa 1000000000
int random(int n){
    return (long long)rand()*rand()%n;
}
int main(){
    int n,i;
    freopen("data.in","w",stdout);
    srand((unsigned int)time(0));
    n=random(maxn)+1;//数据个数n
    printf("%d\n",n);
    for(i=1;i<=n;i++)printf("%d ",random(maxa)+1);
    printf("\n");
    return 0;
}
 

test:Windows 系统对拍程序

test.cpp test.exe

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
int main(){
    int i;
    double st,ed;
    for(i=1;i<=1000;i++){
        system("random");
        st=clock();
        system("sol");
        ed=clock();
        system("bf");
        if(system("fc data.out data.ans")){
            printf("Wrong Answer! %d\n",i);
            return 0;
        }else
            printf("Accepted,测试点 #%d, 用时%.0lfms\n",i,ed-st);
    }
    return 0;
}

生成四个可执行文件

bf.exe sol.exe random.exe test.exe

放在同一个文件夹内


在cmd 运行 test.exe

以下为程序运行情况


文件夹会生成三个文件 data.in data.out data.ans


2018-4-11

算法竞赛进阶指南》是一本针对已有一定基础的算法学习者设计的专业书籍,适合希望深入掌握算法数据结构、提升编程竞赛能力的学习者[^1]。该书内容涵盖了从基本算法到图论、网络流等多个高级主题,结构清晰且具有深度。 ### 书籍特色 - **章节安排**:书中每一章都会聚焦一个特定的主题,例如0x61章节讨论最短路径问题,0x64涉及基环树等复杂数据结构,而0x6A则介绍了网络流的基本概念和应用[^3]。 - **实践导向**:每个知识点后都配有例题及习题,帮助读者通过实际练习加深理解。 - **难度递进**:从基本算法(如位运算)逐步过渡至更复杂的主题(如Tarjan算法在有向图中的应用),确保了学习曲线的合理性。 ### 学习资源推荐 为了更好地利用这本书进行学习,可以参考以下方法: - **配套博客笔记**:网上有很多学习者分享的读书笔记和解题报告,这些资料通常包含详细的代码实现和思路解析,能够有效辅助理解和应用书中的理论知识。 - **在线评测系统**:像LeetCode、Codeforces、AtCoder等平台提供了大量题目,可以根据书中章节选择对应难度和类型的题目进行练习。 - **社区交流**:加入相关的论坛或QQ群、微信群,其他学习者交流心得,遇到难题时也可以寻求帮助。 ### 示例代码 书中某些章节会提供C++示例代码来演示具体算法的应用场景。例如,在讲解栈操作时,可能会给出如下代码片段: ```cpp #include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; stack<int> st; vector<int> a(n+2), m(n+2); for(int i = 1; i <= n; i++) { cin >> a[i]; } // 求出后缀最大值 for(int i = n; i >= 1; i--) { m[i] = max(m[i+1], a[i]); } for(int i = 1; i <= n; i++) { st.push(a[i]); while(!st.empty() && st.top() > m[i+1]) { cout << st.top() << " "; st.pop(); } } while(!st.empty()) { cout << st.top() << " "; st.pop(); } return 0; } ``` 这段代码展示了如何使用栈处理后缀最大值的问题,是理解相关算法逻辑的一个良好起点[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值