目录
比赛反馈:
学习建议:
算法路线:
刷题平台:
比赛:
比赛题目讲解:
第一题:
第二题:
第三题:
第四题:
结尾:
今天也是成功参加了CSDN编程赛线上赛的比赛,首先值得肯定的是比赛的模式还算完整,虽然有些漏洞,但是整体上来说还是较为完整的。
比赛反馈:
作为一个常年混迹在ACM,PAT,蓝桥杯比赛中的选手来说,题目并不算太难,不过值得建议的是:题目有很多都是原题,这点对比力扣或者牛客的线上赛并不算好,所以我认为官方大大可以在题目质量上去加强以下。
其次值得吐槽的一点是,这次的三四题有明显的bug,首先第三题是一个很简单的dp原题,但是官方给出的测试数据似乎有问题,这也导致了参赛的体验感不是特别好,第四题呢就是题意描述不太清楚,而且测试的数据也有一点问题感觉,所以导致这次比赛的体验感不好。
学习建议:
然后对于想进行这总算法学习的朋友,我建议你要先去了解以下你需要学习什么知识,然后根据这些知识去一个个啃,最为重要的是,一定要刷题!一定要刷题!一定要刷题!至于刷题的平台我在下文中会给你推荐一些我认为比较好的平台的。然后你可以试着去参加一些平台的比赛,就比如这次的CSDN比赛,去练练手,增加自己的知识面,然后就可以试着去报名蓝桥杯,PAT,CCPC,ICPC等一系列这种类型的比赛啦。
算法路线:
刷题平台:
关于刷题的话现阶段这些程序员相关的网站都有自己的刷题体系,比如:CSDN,牛客,力扣,洛谷等很多网站都有自己的题库,大家可以去适当的选择自己比较喜欢的网站去进行刷题。
这些都是一些刷题的平台,你完全可以去这些平台上去进行平时的练习。
比赛:
接下来参加比赛的话,上面有提到说是一些比赛,其实在我看来比赛只有ACM和其他。虽然这样说很夸张,但是ACM的含金量是毋庸置疑的,他没有所谓的学校保护,大家众生平等,这样的一个赛事也注定了他的含金量是非常的高的,ACM拿奖也是我们每个算法人心中的梦想,悄悄的说一句噢,ACM的比赛是全英文的。
比赛题目讲解:
最后来说一下今天的一个比赛题目吧。
第一题:
第一题的话是一个非常简单的模拟,
题目我也找到了:
题目描述
夏天到了,各家各户的用电量都增加了许多,相应的电费也交的更多了。小玉家今天收到了一份电费通知单。小玉看到上面写:据闽价电[2006]27号规定,月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行,月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行,月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行;小玉想自己验证一下,电费通知单上应交电费的数目到底是否正确呢。请编写一个程序,已知用电总计,根据电价规定,计算出应交的电费应该是多少。
输入输出格式
输入格式:
输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。
输出格式:
输出一个数,保留到小数点后1位(单位以元计,保留到小数点后1位)。
输入输出样例
输入样例#1:
267
输出样例#1:
121.5
这道题没什么难度,就是按照他们题目的意思进行模拟就行。主要就是考察了if语句。
AC代码:
#include<iostream>
#include<stdio.h>using namespace std ;int main(void)
{double e ; //e代表电量 double money; //代表电费 cin>>e;if(e<=150) money = e*0.4463; //电量少于150KWh时的电费if(e>150 && e<=400) money = 150*0.4463+(e-150)*0.4663; //电量多于150KWh,少于400KWh时的电费if(e>400) money = 150*0.4463+250*0.4663+(e-400)*0.5663; //电量多于400KWh时的电费printf("%.1lf",money); //输出时保留小数点1位cout << endl ; return 0;
}
第二题:
第二题也是一个简单的模拟,好像是一个字符串的反转吧。
题目大概是这样的:于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整,也就是说,字符串由一些由空格分隔的部分组成,需要将这些部分逆序。
这题也是so easy啊,直接进行模拟就行,没有什么难度,暴力直接解出来了。
AC代码:
#include <cstdio>
#include <iostream>
#include <string.h>using namespace std ;int main() {string s ;getline(cin, s) ;int head;int tail;int index;tail = head = s.size() - 1;for( ; head >= -1; ) {if(head != -1 && s[head] != ' ') {head--;} else {if(tail != head) {for(index = head + 1; index <= tail; index++) {printf("%c", s[index]);}printf(" ");head--;tail = head;}}} return 0;
}
第三题:
第三题就有一点难度了,这里涉及到了一个简单的dp思想。
大概的题目要求是这样的:
将整数 n 分成 k 份,且每份不能为空,任意两个方案不相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5
1,5,1
5,1,1
问有多少种不同的分法。
至于dp不太了解的朋友门们,可以关注下我的零基础学算法,我后面会为大家讲解dp思想,以及一些基础题型和模板的。
这里我给出一个AC代码:
#include <iostream>
using namespace std;
typedef long long ll;
int n, k;
ll f[205][200];
const int mod=1e9+7;int main() {cin >> n >> k;if(k>n){cout<<0<<endl;return 0;}for (int i = 1; i <= n; i++) {f[i][1] = 1;for (int j = 2; j <= min(i, k); j++){f[i][j] = f[i - j][j] + f[i - 1][j - 1];f[i][j]%=mod;}}cout << f[n][k]%mod<<endl;;return 0;
}
第四题:
第四题
对于第四题我也很疑惑,我不是很明白题目的意思,这里我也没给出正确代码,不过等官方放出公布后,我会第一时间更新这个题目的讲解,我个人感觉这个题目是用贪心+dp进行思考的。
题目的大致意思是:
完美数列是,总中间到两边分别递减1的数列,然后两边数还要相等,给你一个数组为你最小操作数(应该是)。
这个题目我没有找到完整题目,因为现在比赛试题还看不到,所以只能把大致的意思描述提一下,我个人使用贪心进行写的时候没有通过全部的样例,这里也就不给大家放我的错误代码啦。
结尾:
大家有什么要求尽管给我提出,我都会一一详细解答的。