1.读题
不要放过任何一个细节 这对规避一些问题以及寻找思路有很大的帮助
例题:作为篮球队教练,你需要从名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
编号1~20为球员,后面紧跟的5个数值是其在5个位置的表现,一个球员只能担任一个位置,所以在选取该球员时应该综合考虑,如17号很出色在1 3 4 号位都为最高分,但综合考虑 应该让其担任3号位,因为17号3号位分数最好。
此题可以通过观察与口算得出:
97(1)+99(10/20) + 99(17)+97(15)+98(18/12)
490
当然仔细观察还有更多的解法,此题只是想说明读题的重要性
2.理清楚思路
想清楚用什么知识点,将步骤一步步写出来
例题:
试题 G: 完全二叉树的权值
时间限制: 1.0s 内存限制: 256.0MB
本题总分:20 分
【问题描述】
给定一棵包含 N 个节点的完全二叉树,树上每个节点都有一个权值,按从 上到下、从左到右的顺序依次是 A 1 , A 2 , ··· A N ,如下图所示: 现在小明要把相同深度的节点的权值加在一起,他想知道哪个深度的节点 权值之和最大?如果有多个深度的权值和同为最大,请你输出其中最小的深度。 注:根的深度是 1。
【输入格式】
第一行包含一个整数 N。
第二行包含 N 个整数 A 1 , A 2 , ··· A N 。
【输出格式】
输出一个整数代表答案。
【样例输入】
7 1 6 5 4 3 2 1
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例,1 ≤ N ≤ 100000,−100000 ≤ A i ≤ 100000。
知识点:
完全二叉树第i层的最大节点数为2^(i-1)
个
深度为 n 的完全二叉树最多拥有 2^n - 1
个节点
层数为17的完全二叉树最多拥有2^17-1=131071个结点,题目要求N<=100000
步骤:
- 首先肯定是要写出能够代表或者获取树深度的函数 getdeep()
- 考虑如何存储权值并计算一层中权值的总和
- 对总和进行排序后的输出
代码:
#include<iostream>
using namespace std;
int getdeep(int n){
int result=0;
while(n>0){
n=n/2;
result++;
}
return result;
}
int main(){
int weight[18]={0},n;
cin>>n;
int i=1,quanzhi,max,cengshu=1;
for(i=1;i<=n;i++){
int point=getdeep(i);
scanf("%d",&quanzhi);
weight[point]+=quanzhi;
if(i==1){
max=weight[1];
}
if(weight[point]>=max){
max=weight[point];
cengshu=point;
}
}
cout<<cengshu<<endl;
return 0;
}
以上代码仅供参考,可能会超时。
3.及时保存
养成ctrl+s
的习惯防止电脑忽然炸了,你也炸了
4.数据试验
(1).代码写好后,先把给的样例放进去试验。
(2).然后自己造数据,尽量造一些特例,如:边界的数据以及 0 1 -1等特殊数据,确保程序不error的情况下结果也要校对正确
(3). 观察每次出结果的时间,有没有比较难受的停顿,如果有,尽量优化的你代码,时间问题也很致命,尽量把数组开在main之外,最好是定长 例如 static int array[20]
5.注意一下
蓝桥杯和ACM不同,放入代码不会告诉你对错,其实是类似于答卷子,是可以修改的
前几道题是填空题,有时可以不用写代码解除,可以节省时间
填代码的填空题可以复制代码到编辑器,然后不停地去试,一般可以试出来
常考题型有限,最后一周可以针对性练习一下:
搜索 枚举 模拟 递归 数学问题 动态规划 贪心 二分 DFS BFS 图 树
6.常用头文件
使用头文件让你解题更快更舒服
#include<stdio.h> //输入输出
#include<stdlib.h>
#include<algorithm>
#include<math.h>
#include<String.h>
#include<vector>
#include<queue>
#include<stack>
#include<time.h>
#include<stdlib.h>
bsearch()函数用法
#include <iostream>
#include <stdlib.h>
using namespace std;
int cmpfunc(const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
int values[] = { 5, 20, 29, 32, 63 };
int main ()
{
int *item;
int key = 3;
/* 使用 bsearch() 在数组中查找值 32 */
item = (int*) bsearch (&key, values, 5, sizeof (int), cmpfunc);
if( item != NULL )
{
printf("Found item = %d\n", *item);
}
else
{
printf("Item = %d could not be found\n", key);
}
return(0);
}
free() malloc() realloc()
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *str;
/* 最初的内存分配 */
str = (char *) malloc(15);
strcpy(str, "runoob");
printf("String = %s, Address = %p\n", str, str);
/* 重新分配内存 */
str = (char *) realloc(str, 25);
strcat(str, ".com");
printf("String = %s, Address = %p\n", str, str);
/* 释放已分配的内存 */
free(str);
return(0);
}
abs() 取绝对值
#include<string.h>
char *strcat(char *dest, const char *src)
把 src 所指向的字符串追加到 dest 所指向的字符串的结尾。
int strcmp(const char *str1, const char *str2)
把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
char *strcpy(char *dest, const char *src)
把 src 所指向的字符串复制到 dest。
#include<math.h>
double pow(double x, double y)
返回 x 的 y 次幂。
返回 x 的平方根。
#include<algorithm>
sort 快速排序
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool myfunction(int i,int j){
return(i<j);
}
int main(){
int array[]={32,71,12,45,26,80,53,33};
vector<int> myarray (array,array+8);
sort(myarray.begin(),myarray.end(),myfunction);
int i=0;
for(i;i<8;i++){
cout<<myarray[i]<<" ";
}
}
7.玩一玩矩阵
矩阵的转置
题目:给出n×m的整数矩阵,请你把这个矩阵顺时针旋转90°后输出
输入格式:
第一行输入两个整数n,m(1≤n,m≤200),用空格隔开。
接下来n行,每行输入m个整数,表示输入的矩阵,矩阵中元素都是int范围内的整数。
输出格式:
输入m行,每行n个空格隔开的整数,表示旋转后的矩阵。注意:每行末尾不能输出多余的空格
样例输入:
3 4
-1 3 6 3
7 7 9 1
10 3 4 6
样例输出:
10 7 -1
3 7 3
4 9 6
6 1 3
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!