2020/6/20比赛解题报告

F题考试成绩——拓扑排序

算法操作:
将入度为0的节点入队——把节点存入数组——然后删除以该节点为起始点的边(入度- -)

主要代码在快读之后

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#define mem(a) memset(a,0,sizeof(a))    //
using namespace std;
const ll mx=500+5;
inline int read() {
    int x=0,flag=1;
    char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
    return x*flag;
}
int n,m,res[mx];
int G[mx][mx];  //邻表来存这个DAG
int indegree[mx];  //对箭头指向的点有一个入度统计
priority_queue<int,vector<int>,greater<int> > q;//用优先队列可以按大小顺序输出
void toposort() {
    for(int i=1;i<=n;i++) {
        if(indegree[i]==0) {q.push(i);}   //入度为0的入队
    }
    int t=0;
    while(!q.empty()) {
        int temp=q.top();q.pop();
        res[t++]=temp;
        for(int i=1;i<=n;i++) {
            if(G[temp][i]) {indegree[i]--;q.push(i); }//删去入度0节点所连的边
        }
    }
}
signed main() {	//signed纯属装
    while(scanf("%d %d",&n,&m)==2&&n) {
        mem(G),mem(res),mem(indegree);
        while(m--) {
            int a=read(),b=read();
            G[a][b]=1;
            indegree[b]++;  //入度加
        }
        toposort();
        for(int i=0;i<n-1;i++)
            printf("%d ",res[i]);
        printf("%d\n",res[n-1]);
    }
    return 0;
}

H题修建道路

超级简单的并查集应用(当时居然没写粗)还是不熟练
搞懂了路径压缩用起来还是蛮顺手的

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstring>
#include <queue>
#define ll long long
#define ull unsigned long long
#define mem(a) memset(a,0,sizeof(a))    //
using namespace std;
const ll mx=500+5;
const double PI=acos(-1.0);
inline int read() {
    int x=0,flag=1;
    char c=getchar();
    while(!isdigit(c)) {if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) {x=x*10+c-'0';c=getchar();}
    return x*flag;
}
struct team {
    int u,v,w;
}a[10005];
int f[305];
bool cmp(team a,team b) {return a.w<b.w; }
int Find(int x) {return f[x]==x?x:f[x]=Find(f[x]); }
signed main() {
    int n=read(),m=read();
    for(int i=0;i<m;i++) {
        a[i].u=read(),a[i].v=read(),a[i].w=read();
    }
    for(int i=1;i<=n;i++) f[i]=i;
    sort(a,a+m,cmp);
    int Max=0,tot=0;
    for(int i=0;i<m;i++) {
        int x=Find(a[i].u),y=Find(a[i].v);
        if(x!=y) {f[x]=y;Max=max(Max,a[i].w);tot++; }
        if(tot==n-1) break;	//
    }
    printf("%d %d",n-1,Max);
    return 0;
}

第一次用博客记录学习过程,希望能坚持下去

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以通过以下几个步骤来准备蓝桥杯C/C++比赛: 1. 学习C/C++语言基础知识,包括语法、数据类型、运算符、流程控制等。 2. 练习编写算法数据结构,例如排序、查找、树、图等。 3. 参加在线编程练习,例如LeetCode、洛谷、牛客网等,提高编程能力和解题能力。 4. 阅读蓝桥杯历年真题,了解比赛的考察范围和难度。 5. 参加模拟赛和培训班,提高比赛经验和技巧。 希望以上建议能够帮助你准备蓝桥杯C/C++比赛。 ### 回答2: 准备蓝桥杯C/C++编程比赛的关键步骤如下: 1. 学习C/C++语言基础知识:了解C/C++的语法规则和常用库函数,掌握变量的定义和使用、条件语句、循环结构等编程基本概念。 2. 理解算法数据结构:熟悉常用的算法数据结构,包括数组、字符串、链表、栈、队列和树等,能够灵活运用它们解决实际问题。 3. 多做编程练习题:通过做一些编程练习题提高自己的编程能力,例如POJ、LeetCode等在线编程平台上的题目可以供选择。多做一些具有挑战性的题目,加深对算法数据结构的理解,并培养解决问题的思维方式。 4. 查阅相关资料:阅读一些与蓝桥杯竞赛相关的书籍和网上的教程,了解考试的题型、要求和考察的重点,提前准备一些常见的题型并查找相关实例。 5. 组队参加训练:找一些具有一定编程实力的同学组成队伍,一起参加C/C++编程训练营或组织小规模的训练,相互讨论问题,共同进步。 6. 参加模拟赛:参加一些模拟赛进行考试模拟训练,熟悉考试流程、时间管理和答题技巧。 7. 时间规划和备考:根据自己的实际情况,合理安排备考时间,多进行编程实践,磨练自己的编程技能,并适当进行复习和总结。 8. 勇敢参赛:在比赛开始前保持积极心态,相信自己的实力,充分发挥已掌握的知识和技能,勇敢去参赛并努力取得好成绩。 通过以上准备措施,可以提高解题速度、优化代码逻辑,加强对算法数据结构的理解,并增强在C/C++编程方面的技能,为蓝桥杯C/C++编程比赛做好充分准备。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值