学习与做事的先后顺序

物有本末,事有终始,知所先后,则近道矣 - 《大学》

一直以来我的做事风格是,如果我有个任务需要完成,但是这个任务涉及的全部或部分技术我不会或不熟悉,我就会先找个教程,把这些技术全完整的学一遍,然后再去做事。比如之前公司安排写Shell脚本,我就先花了两个星期学习Shell脚本。朋友要我帮忙做前端,我就去把html、javascript、vue全套教程先学一遍,再开始做。

但是我最近想换一种思路了,原来那种感觉做事之前要花太久的时间学习,而且每门知识要学到熟练,也是要特别的多的时间,就算前期花了两个星期看Shell编程,也就入了个门,但是那些事儿就在那搁浅着、等着,那做事儿也太慢了吧,要是公司的还有个工期压着,要是自己的,比如做那个前端,我把所有的都学完,那得到猴年马月啊。

我现在就换种思路,先迅速的花个一两天把技术的基本东西看懂,然后就开始做事,慢点儿没关系,一定要开始,不能总在那搁浅着。比如我想周末写前端,那就排当天的计划,把做事排在前面,把学习排在后面,先做事,再学习。并且实践遇到了问题,又促进有学习的动力,像之前我看阮一峰老师的js教程,实在太多了!!看很多天都没看完,而且光看也不实践,一是做的慢,二呢做着做着也容易动力不足。

总之,开始试试这种方式,一两天了解基本知识,然后开始做事,每天排计划的时候,把做事放在前头,把学习放在后头,边做边学,边学边做。就这样。

这道题可以使用拓扑排序来解决。将有前置条件的任务连边,然后进行拓扑排序。如果存在环,则说明无法完成所有任务;否则,按照拓扑序输出所有任务即可。 具体的思路是:首统计每个任务的入度,然后将所有入度为 0 的任务加入队列,不断从队列中取出一个任务,将其指向的任务的入度减 1,如果减为 0,则将该任务加入队列中。最后如果队列中取出的任务数不等于任务总数,则说明存在环;否则,按照拓扑序输出所有任务即可。 以下是C++代码实现: ```c++ #include <iostream> #include <vector> #include <queue> using namespace std; int main() { int n, m; cin >> n; vector<int> in_degree(n + 1); // 每个任务的入度 vector<int> priority(n + 1); // 每个任务的优级 vector<int> necessary(n + 1); // 每个任务的必要程度 vector<vector<int>> adj(n + 1); // 每个任务指向的任务 for (int i = 1; i <= n; i++) { string name; cin >> name >> necessary[i] >> priority[i]; } cin >> m; for (int i = 0; i < m; i++) { string t1, t2; cin >> t1 >> t2; int u = stoi(t1.substr(1)); int v = stoi(t2.substr(1)); adj[u].push_back(v); // u 指向 v in_degree[v]++; // v 的入度加 1 } queue<int> q; for (int i = 1; i <= n; i++) { if (in_degree[i] == 0) { q.push(i); } } vector<int> ans; while (!q.empty()) { int u = q.front(); q.pop(); ans.push_back(u); for (int v : adj[u]) { in_degree[v]--; if (in_degree[v] == 0) { q.push(v); } } } if (ans.size() != n) { cout << -1 << endl; } else { sort(ans.begin(), ans.end(), [&](int x, int y) { if (necessary[x] != necessary[y]) { return necessary[x] > necessary[y]; } else if (priority[x] != priority[y]) { return priority[x] > priority[y]; } else { return x < y; } }); for (int x : ans) { cout << x << " "; } cout << endl; } return 0; } ``` 希望能够帮到你!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值