nullPart I
ACM竞赛简单题秒杀攻略Part I
ACM竞赛简单题秒杀攻略简单题简单题简单题的特点:
没有算法或者只有基本的算法
编程复杂度不高
分辨简单题:
简单题一般题目较短
校赛的第一题往往是简单题
观察rank list和场上气球情况
简单题是校赛决胜的关键简单题是校赛决胜的关键
如何秒杀简单题如何秒杀简单题提高代码正确率
提高写代码的速度
熟练掌握各种基本算法Step 1: 解析题目Step 1: 解析题目背景介绍、问题提出
输入输出要求
输入输出样例
时间、空间限制以及其他信息Step 2: 了解输入输出Step 2: 了解输入输出输入输出是分离的
<输入文件 >输出文件
输入,以EOF结束(例题:ZOJ 1001)
while (scanf(“%d”, &n) != EOF) {
…
}
while (cin >> n) {
…
}
输入,以0结束(例题:ZOJ 1115)
while (scanf(“%d”, &n) != EOF && n != 0) {
…
}
<- acm.zju.edu.cnStep 2: 了解输入输出Step 2: 了解输入输出输入,先输入case数
scanf(“%d”, &nCases);
for (i = 0; i < nCases; ++i) {
...
}
整行输入
char buffer[256];
gets(buff);
string buf;
getline(cin, buff);
Step 2: 了解输入输出Step 2: 了解输入输出输出,case之间用空行分隔(例题:ZOJ 1152)
int nCases = 0;
{
if (nCases++) printf(“\n”);
…
}
输出,每个case之后输出空行(例题:ZOJ 1457)
{
…
printf(“%d\n\n”, ans);
}
Step 3: 了解常见错误类型Step 3: 了解常见错误类型Compilation Error 编译错误
Segmentation Fault 数组越界、堆栈溢出等
Time Limit Error 运行时间超限
Memory Limit Error 内存超限
Wrong Answer
答案
八年级地理上册填图题岩土工程勘察试题省略号的作用及举例应急救援安全知识车间5s试题及答案
错误
Presentation Error 格式错误
Output Limit Error 输出超限
Restricted Function 非法函数Step 4: 程序调试Step 4: 程序调试重新读题、检查代码
数组是否开的够大(大数组开到全局,避免堆栈溢出)
int -2^31 ~ 2^31 – 1
long long largenumber; // -2^63 ~ 2^63 - 1
printf(“%lld\n”, largenumber);
构造测试数据
题目提供的测试数据一般较弱
边界数据、特殊数据Step 5: 复杂度估计Step 5: 复杂度估计估计程序空间复杂度
默认空间限制:32M
char c[1000000]; // 1M
int a[1000][1000]; // 4M
估计程序时间复杂度
一般ZOJ可以接受的时间复杂度为10^6~10^7Step 5: 复杂度估计Step 5: 复杂度估计数据范围 允许的时间复杂度
10^20 O(logN)
10^9 O(logN) O(sqrt(N))
10^6 O(N)
10^5 O(N logN)
10^4 O(N logN) O(N sqrt(N))
10^3 O(N^2)
10^2 O(N^3)
20 O(2^N)如何秒杀简单题如何秒杀简单题提高代码正确率
提高写代码的速度
熟练掌握各种基本算法Step 1: 熟悉编程环境Step 1: 熟悉编程环境VC6.0、Dev-C++等与ZOJ编译器的区别
for (int i = 0; i < 10; ++i) {
…
}
i = i * i // <-VC6.0编译通过,但是在ZOJ编译出错
Dev-C++ 中long long 的输入格式为%I64d,而ZOJ中为%lld
变量名的选取,避免常用单词(xor and等)Step 2: 熟悉ZOJ环境Step 2: 熟悉ZOJ环境比赛前至少要在ZOJ上过题
熟悉题目的各个组成部分
熟悉输入输出格式
熟悉交题、查看返回信息的
方法
快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载
熟悉Runs中的Search功能Step 3: 多做在线比赛、练习Step 3: 多做在线比赛、练习TopCoder : www.topcoder.com/tc
ZOJ : acm.zju.edu.cn
POJ : acm.pku.edu.cn
HDOJ: acm.hdu.edu.cn
USACO: ace.delos.com/usacogate
SGU: acm.sgu.ru
Timus: acm.timus.ruStep 4: 团队合作、赛场动向Step 4: 团队合作、赛场动向ACM是注重合作的竞赛
三人分工看题、讨论、写题,协调上机时间
三人根据各自特点定位角色、分工
遇到卡题的时候,交换检查、测试
一些比赛经验(Special Thanks to LCLL)
优先做简单题
观察气球和排名,了解简单题动向,避免卡题
90%以上的队伍曾经赛后发现自己全场看错题了,因此每个题的题意至少要两人以上看过,特别是没过题时Step 4: 团队合作、赛场动向Step 4: 团队合作、赛场动向一些比赛经验续
过sample,并且尽量稍微测试后再交题
注意使用打印功能,调试程序尽量下机,把时间留给写题的队友
对题目有疑问、比赛时候出现意外的,马上联系巡场工作人员
学会放弃如何秒杀简单题如何秒杀简单题提高代码正确率
提高写代码的速度
熟练掌握各种基本算法Step 1: 学好数据结构Step 1: 学好数据结构常用数据结构
链表
堆栈/队列
优先队列
树
图
Hash
并查集Step 2: 学习常见算法Step 2: 学习常见算法常用的题型(ZOJ论坛有题目分类信息)
简单题
模拟题
搜索题
贪心题
动态规划(DP)题
图论题
数学题Step 3: 日常学习Step 3: 日常学习周围的算法讨论区
编程答疑@cc98
Algorithm@88(飘渺水云间)
做题+看书,算法真有趣
满世界做题、参加比赛
在ZOJ上多做题,参加浙江大学ACM集训队
关注ZOJ、编程答疑、Algorithm最新通知
Part II
Standard C++ LibraryPart II
Standard C++ LibraryC++风格头文件C++风格头文件#include
#include
#include
#include
#include
#include
#include
using namespace std;
输入输出流输入输出流cin >> n >> m;
cout << x << “=” << y << endl;
getline(cin, str);
输出控制:
#include
cout.setf()
cout.unsetf()
cout.precision()输入输出流输入输出流使用方法示例
double a = 1234;
cout.setf(ios::fixed);
cout.precision(3);
cout << a << endl;
输出
1234.000string类string类#include
s = “hello world”;
s += “h”;
s = t + “asdf”;
if (s > t)
s.substr(3);string类string类常用成员函数
s.size() 字符串长度
s.c_str() 返回char *类型的字符串
s.find(“hi”) 查找子串,返回起始位置,不存在返回string::npos
s.find_last_of(“hi”) 特定方式查找子串
s.substr(0, 5) 获取子串
s.substr(5)
stringstream类stringstream类#include
istringstream, ostringstream, stringstream
使用方法和cin, cout相似
istringstream使用示例
string s = “a b c”, t;
istringstream is(s);
while (is >> t) cout << t << endl;
输出
a
b
cstringstream类stringstream类ostringstream使用示例
ostringstream os;
os << 3 << “ solutions”;
cout << os.str() << endl;
输出
3 solutionsSTL容器STL容器STL容器实现了一些常用的数据结构
vector 数组/堆栈
list 链表
queue 队列
deque 双向队列
set 集合
map 字典、映射
priority_queue 优先队列IteratorIterator可以把Iterator看成某种指针,指向容器内部
C语言中的指针就是一种特殊的Iterator
Iterator和指针一样支持*和->操作
可以使用Iterator的++运算符来遍历容器
一般的容器都提供了begin()和end()两个函数来得到指向容器头、尾的两个Iterator。其中begin指向头元素,end指向最后一个元素的后一个位置。Iterator的分类Iterator的分类Input Iterator
Output Iterator
Forward Iterator
Bidirectional Iterator
双向移动,只支持++和--操作
list/map/set
Random Access Iterator
支持所有的指针操作
vectorvectorvector#include
动态数组
vector arr;
arr = vector(10);
arr.push_back(3);
cout << arr[2] << endl;
arr = arr2;
if (arr < arr2)vectorvector常用的操作
arr.clear();
arr.push_back(5);
arr.pop_back();
arr.front();
arr.back();
arr.erase(arr.begin() + 5);
arr.erase(arr.begin(), arr.end());
arr.insert(arr.begin() + 5, 4);vectorvectorvector的初始化
vector arr(100, 0);
或者
arr = vector(100, 0);
vector VS 数组
vector的灵活性比较好,不需要考虑长度问题,可以减少编程复杂度,使用起来和数组一样方便。但是vector的效率远低于数组,在效率要求较高时慎用。vectorvectorvector的遍历
for (vector::iterator vi = arr.begin(); vi != arr.end(); ++vi) {
cout << *vi << endl;
}
或者
for (int i = 0; i < v.size(); ++i) {
cout << v[i] << endl;
}listlist#include
双向链表
push_back, pop_back, push_front, pop_front
由链表的特性可知,list的迭代器不支持算数运算。例如l.begin() + 5是非法的,而list也不支持[]运算符,因此遍历list只能使用Iterator方式。dequedeque#include
双向队列
deque是vector和list的中间产物,其内部结构是若干小段被连接起来的连续空间。
deque支持push_front和pop_front
deque和vector一样支持下标访问
deque的实现比vector和list都要复杂,因此直接影响了它的效率。priority_queuepriority_queue#include
用最大堆实现的优先队列
priority_queue中的元素需要支持<操作符。
priority_queue不支持clear操作。
常用操作
pq.top();
pq.push(5);
pq.pop();priority_queuepriority_queue相关题目
ZOJ 2724,2006年校赛预赛题
模拟windows消息队列机制,随着时间不断有新的消息加入到队列,不同的消息有不同的权重,权重高的要先处理。setset#include
有序的元素集合,set中的元素也要支持<操作符
支持元素插入、删除和查找,复杂度为O(logN)
双向迭代器,不支持随机访问
常用操作
set s;
s.insert(3);
s.erase(5);
if (s.find(5) == s.end()) // 5不在集合中setsetset的遍历
for (set::iterator si = s.begin(); si != s.end(); ++si) {
cout << *si << endl;
}
遍历的顺序是有序的mapmap#include