ACM集训第一次积分赛赛前复习+day4
不知不觉4天过去了,我们迎来了我们第一次积分赛,赛前的四天我们学了以下知识点吧:
day 1、排序
之前一直想用qsort,但是总是写不明白,STL的sort()可以说是很方便了。
先写一个最基础的数组排序
bool compare(int a,int b) { return a<b; //升序排列,如果改为return a>b,则为降序 }#include <algorithm> int main() { int a[20]={2,4,1,23,5,76,0,43,24,65},i; for(i=0;i<20;i++) cout<<a[i]<<endl; sort(a,a+20,compare); for(i=0;i<20;i++) cout<<a[i]<<endl; return 0; }
还有就是稍微复杂点的结构体排序
#include <iostream> #include <vector> #include <algorithm> using namespace std; typedef struct example { int elem1; int elem2; }example; /*这个comparison函数很重要.如果希望升序排序,就是"<",降序排列就是">"号,这样便于直观记忆.如果希望用elem2作为比较标准 就把elem1改为elem2,这样结构体就以elem2为比较标准排序了.*/
bool comparison(example a,example b){ return a.elem1<b.elem1; } int main() { int N; fin>>N; vector<example> array(N); for(int i=0;i<N;i++) { fin>>array[i].elem1>>array[i].elem2; } sort(array.begin(),array.end(),comparison); for(int i=0;i<N;i++) { cout<<array[i].elem1<<" "<<array[i].elem2<<endl; } return 0; }
day 2、BIT冬训-模拟&枚举
模拟和枚举个人感觉算是比较简单的了,因为没有算法,所以数据范围不会很大,也不用担心TLE,但是给我印象很深的就是迷宫题和五子棋题,挺复杂的。
这里贴一个五子棋的题
Alice and Bob play 5-in-a-row game. They have a playing field of size 10 × 10. In turns they put either crosses or noughts, one at a time. Alice puts crosses and Bob puts noughts.
In current match they have made some turns and now it's Alice's turn. She wonders if she can put cross in such empty cell that she wins immediately.
Alice wins if some crosses in the field form line of length not smaller than 5. This line can be horizontal, vertical and diagonal.
Input
You are given matrix 10 × 10 (10 lines of 10 characters each) with capital Latin letters 'X' being a cross, letters 'O' being a nought and '.' being an empty cell. The number of 'X' cells is equal to the number of 'O' cells and there is at least one of each type. There is at least one empty cell.
It is guaranteed that in the current arrangement nobody has still won.
Output
Print 'YES' if it's possible for Alice to win in one turn by putting cross in some empty cell. Otherwise print 'NO'.
Example
XX.XX.....
.....OOOO.
..........
..........
..........
..........
..........
..........
..........
..........
YES
XXOXX.....
OO.O......
..........
..........
..........
..........
..........
..........
..........
..........
NO
代码如下
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <string> #include <map> #include <vector> #include <set> #include <queue> using namespace std;char mp[12][12]; int main() { for (int i = 0; i < 10; ++i) { scanf("%s",mp[i]); } for (int i = 0; i < 10; ++i) { for (int j = 0; j < 10; ++j) { if (mp[i][j] == '.') { int s=1; s = 1; for (int k = j - 1; k >= 0; --k) { if (mp[i][k] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } for (int k = j + 1; k < 10; ++k) { if (mp[i][k] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } s = 1; for (int k = i - 1; k >= 0; --k) { if (mp[k][j] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } for (int k = i + 1; k < 10; ++k) { if (mp[k][j] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } s = 1; for (int k = i - 1, q = j - 1; k >= 0 && q >= 0; --k, --q) { if (mp[k][q] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } for (int k = i + 1, q = j + 1; k < 10 && q < 10; ++k, ++q) { if (mp[k][q] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } s = 1; for (int k = i + 1, q = j - 1; k < 10 && q >= 0; ++k, --q) { if (mp[k][q] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } // 右上 for (int k = i - 1, q = j + 1; k >= 0 && q < 10; --k, ++q) { if (mp[k][q] == 'X') { ++s; if (s==5) { printf("YES\n"); return 0; } } else break; } } } } printf("NO\n"); return 0; }
这题的思路是看别人的,不知道贴上来算不算抄袭、
3、可以看昨天的博客
4、简单数据结构
其实今天挺复杂的,而且也是有点填鸭了,所谓的讲就是把栈,队列,堆,树这些东西怎么定义告诉了我们,并没有告诉我们有什么性质,或者有什么意义,30分钟不到讲了四个东西。我不是吐槽今天讲课的小姐姐,因为这四天都是这样,但是今天的比较困难,就有点说不过去了。不过老实说以后讲课时间会保障1个小时,看看吧。
(1)先说说栈
我也像讲课那样吧,简单的说一下用法。
#include<iostream> #include<stack> using namespace std; int main() { stack <int>stk; //入栈 for(int i=0;i<50;i++){ stk.push(i); } cout<<"栈的大小:"<<stk.size()<<endl; while(!stk.empty()) { cout<<stk.top()<<endl; stk.pop(); } cout<<"栈的大小:"<<stk.size()<<endl; return 0; }
(2)、C++ Queues(队列)、Priority Queues(优先队列)
C++队列是一种容器适配器,它给予程序员一种先进先出(FIFO)的数据结构。
1.back() 返回一个引用,指向最后一个元素
2.empty() 如果队列空则返回真
3.front() 返回第一个元素
4.pop() 删除第一个元素
5.push() 在末尾加入一个元素
6.size() 返回队列中元素的个数
队列可以用线性表(list)或双向队列(deque)来实现(注意vector container 不能用来实现queue,因为vector 没有成员函数pop_front!):
queue<list<int>> q1;
queue<deque<int>> q2;
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“首元(front)” 、“尾元(backt)” 、“加入队列(push)” 、“弹出队列(pop)”等操作。
int main() { queue<int> q; q.push(4); q.push(5); printf("%d\n",q.front()); q.pop(); }
C++ Priority Queues(优先队列)
C++优先队列类似队列,但是在这个数据结构中的元素按照一定的断言排列有序。
1.empty() 如果优先队列为空,则返回真
2.pop() 删除第一个元素
3.push() 加入一个元素
4.size() 返回优先队列中拥有的元素的个数
5.top() 返回优先队列中有最高优先级的元素
优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container 不能用来实现queue,因为list 的迭代器不是任意存取iterator,而pop 中用到堆排序时是要求randomaccess iterator 的!):
priority_queue<vector<int>, less<int>> pq1; // 使用递增less<int>函数对象排序
priority_queue<deque<int>, greater<int>> pq2; // 使用递减greater<int>函数对象排序
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。
1 #include <iostream> 2 #include <queue> 3 using namespace std; 4 5 class T { 6 public: 7 int x, y, z; 8 T(int a, int b, int c):x(a), y(b), z(c) 9 { 10 } 11 }; 12 bool operator < (const T &t1, const T &t2) 13 { 14 return t1.z < t2.z; // 按照z的顺序来决定t1和t2的顺序 15 } 16 main() 17 { 18 priority_queue<T> q; 19 q.push(T(4,4,3)); 20 q.push(T(2,2,5)); 21 q.push(T(1,5,4)); 22 q.push(T(3,3,6)); 23 while (!q.empty()) 24 { 25 T t = q.top(); 26 q.pop(); 27 cout << t.x << " " << t.y << " " << t.z << endl; 28 } 29 return 1; 30 }
输出结果为(注意是按照z的顺序从大到小出队的):
3 3 6
2 2 5
1 5 4
4 4 3
#include <iostream> #include <queue> using namespace std; class T { public: int x, y, z; T(int a, int b, int c):x(a), y(b), z(c) { } }; bool operator > (const T &t1, const T &t2) { return t1.z > t2.z; } main() { priority_queue<T, vector<T>, greater<T> > q; q.push(T(4,4,3)); q.push(T(2,2,5)); q.push(T(1,5,4)); q.push(T(3,3,6)); while (!q.empty()) { T t = q.top(); q.pop(); cout << t.x << " " << t.y << " " << t.z << endl; } return 1; }
输出结果为:
4 4 3
1 5 4
2 2 5
3 3 6
如果我们把第一个例子中的比较运算符重载为: bool operator < (const T &t1, const T &t2) { return t1.z > t2.z; // 按照z的顺序来决定t1和t2的顺序} 则第一个例子的程序会得到和第二个例子的程序相同的输出结果。
目前主要学的就这么多了,感觉题目已经很难很难了。
以上均为不规范转载。。。因为我还没有完全掌握。