Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (9.25 MB, 36 trang )
<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">
Bài 1: Đảo ngược một danh sách liên kết đơn Hãy hoàn thiện các hàm thao tác trên một danh sách liên kết: Thêm một phần tử vào đầu danh sách liên kết In danh sách Đảo ngược danh sách liên kết (yêu cầu độ phức tạp thời gian O(N) và chi phí bộ nhớ dùng thêm O(1))
#include <iostream> using namespace std;
struct Node { % % int data; % % Node*next;% % Node(intdata) {% % % % this->data = data;% % % % next NULL;% % }
Node*prepend(Node* head, int data) {% % Node*newNode newNode(data);% % newNode->next = head;
% % returnnewNode;}
void print(Node* head) {% % Node*current head;% % while (current != NULL) {% % % % cout << current->data << " ";
</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">% % % % current current->next;% % }
% % cout << endl;}
Node*reverse(Node* head) {% % Node*prev NULL;% % Node*current head;% % Node*next NULL;% %
% % while (current != NULL) {% % % % next current->next; % % % % current->next =prev; %
% % }% %
% % returnprev; %}
int main() {
% % freopen("test.inp", "r", stdin);% % freopen("test.out", "w", stdout);% % int , ;u
% % cin >> ;% % Node*head NULL;
% % for (int ; ; i =0 i<n ++i) {% % % % cin >> ;
% % % % head prepend(head, u);% % }
</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">Bài 2: Tính diện tích tam giác Một điểm trong không gian 2 chiều được biểu diễn bằng pair. Hãy viết hàm double area(Point a, Point b, Point c) tính diện tích tam giác theo tọa độ 3 đỉnh. Trong đó, Point là kiểu được định nghĩa sẵn trong trình chấm như sau: using Point = pair<double, double>;
#include <iostream>#include <cmath>#include <iomanip>#include <utility>using namespace std;
using Point =pair<double, double>;
double area(Point , Point , Point ){
% % doublecanh1 =sqrt(pow( .a first -b first, ) 2 +pow( .second bsecond, 2));
% % doublecanh2 =sqrt(pow( .b first -c first, ) 2 +pow( .second csecond, 2));
% % doublecanh3 =sqrt(pow( .a first -c first, ) 2 +pow( .second csecond, 2));
% % double (p= canh1 +canh2 + canh3) ;/2
% % returnsqrt( (p -canh1) (* p -canh2) (* p -canh3));}
int main()
</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">% % cout << setprecision( ) << fixed;
% % cout << area({1, }, {2 2.5, 10}, {15, -5.25}) << endl;% % return ;0
Bài 3: Tính tích có hướng của 2 vector Một vector trong không gian 3 chiều được biểu diễn bằng tuple<double, double, double>. Hãy viết hàm Vector cross_product(Vector a, Vector b) tính tích có hướng của 2 vector. Trong đó Vector là kiểu dữ liệu được định nghĩa sẵn trong trình chấm nhưsau: using Vector = tuple<double, double, double>;
#include <iostream>#include <cmath>#include <iomanip>using namespace std;
using Vector = tuple<double, double, double>;
Vector cross_product(Vector , a Vector )b{
% % doubleax, ay, az, bx, by, bz;% % ax = get<>( );a
% % ay = get<>( );a% % az = get<>( );a% % bx = get<>( );b
</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">% % by = get<>( );b% % bz = get<>( );b
% % returnmake_tuple(ay *bz -az * by, az *bx - bz * ax, ax *by - bx*ay);
}int main(){
% % cout << setprecision( ) << fixed;% % Vectora1.2, , 4 -0.5};
% % Vectorb1.5, - , 2.5};% % Vector c= cross_product(, b);
% % cout << get< >(0 c) << ' ' << get< >(1 c) << ' ' << get< >(2 c) << endl;% % return ;0
Bài 4: Thao tác với vector
Cho hai vector, hãy xóa hết các phần tử chẵn, sắp xếp giảm dần các số trong cả 2 vector và trộn lại thành một vector cũng được sắp xếp giảm dần.
#include <iostream>#include <vector>#include <algorithm>using namespace std;
void print_vector(const vector<int> &a{
% % for (int : )v a
</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">% % % % cout << << ' ';% % cout << endl;}
void delete_even(vector<int> &a{
% % for(auto it =a begin(); it != .end();) {
% % % % % % it =aerase(it);% % % % }
% % % % else {% % % % % % it++;% % % % }% % }}
void sort_decrease(vector<int> &){
% % sort(.begin(), aend(), greater<int>());}
vector<int> merge_vectors(const vector<int> &, const vector<int> &){
% % vector<int> ;c% % for(auto : ) {v a% % % % c push_back( );v% % }
% % for(auto : ) {v b% % % % c push_back( );v% % }
% % sort(.begin(), cend(), greater<int>());% % return ;c
}int main(){
% % int , , ;n u
% % std::vector<int>a, ;b% % std::cin>> m >> ;n% % for (int ; ; i =0 i<m i++)% % {
% % % % std::cin >> ;u% % % % a push_back( );u% % }
% % for (int ; ; i =0 i<n i++)% % {
% % % % std::cin >> ;u% % % % b push_back( );u
</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">#include <bits/stdc++.h>using namespace std;
void dfs(vector list<< int>> adj){% % queue<int> ;s
% % vector<bool> visited(adj.size());
% % % % % % adj u[ ].pop_front();
% % % % % % }% % % % }% % % % else {
% % % % }% % }}int main(){
% % vector list< <int>> adj;
% % adj[ ]push_back(2);% % adj[ ]push_back(4);% % adj[ ]push_back(3);% % adj[ ]push_back(4);% % adj[ ]push_back(5);% % adj[ ]push_back(2);% % adj[ ]push_back(7);% % adj[ ]push_back(7);% % dfs(adj);
}
</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">Bài 6: Viết hàm void bfs(vector< list<int> > adj) thực hiện thuật tốn BFS khơng sử dụng đệ quytrên đồ thị biểu diễn bằng danh sách kề. Đồ thị có n đỉnh được đánh số từ 1 đến n. Thuật toán BFS xuất phát từ đỉnh 1. Các đỉnh được thăm theo thứ tự ưu tiên từ trái sang phải trong danh sách kề. Yêu cầu hàm trả ra thứ tự các đỉnh được thăm (những đỉnh khơng thể thăm từ đỉnh 1 thì khơng phải in ra).
#include <bits/stdc++.h>using namespace std;
void bfs(vector list<< int>> adj){% % queue<int> ;s
% % vector<bool> visited(adj.size());
% % % % % % adj u[ ].pop_front();
% % % % % % }
</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">% % % % }% % % % else {
% % % % }% % }}int main(){
% % vector list< <int>> adj;
% % adj[ ]push_back(2);% % adj[ ]push_back(4);% % adj[ ]push_back(3);% % adj[ ]push_back(4);% % adj[ ]push_back(5);% % adj[ ]push_back(2);% % adj[ ]push_back(7);% % adj[ ]push_back(7);% % bfs(adj);
Bài 7: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp được biểu diễn bằng set
</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">#include <iostream>#include <set>using namespace std;
template <class >
set T< > set_union(const set<> &, const set< > &){
% % set T< > ;t= a% % for (const v : ) {b% % % % t insert( );v% % }
% % return ;t}
% % % % }% % }% % return ;t}
template <class >
void print_set(const std::set T< > &a{
% % for (const x : )a% % {
% % % % std::cout << x << ' ';% % }
% % std::cout << std::endl;}
int main(){
% % std::set<int> { , , , , a= 1 2 3 5 7};% % std::set<int> { , , , , b= 2 4 5 6 9};% % std::set<int> c=set_union(a, b);% % std::set<int> d=set_intersection(, );b% % std::cout << "Union: ";
% % print_set( );c
</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">% % std::cout << "Intersection: ";% % print_set( );d
% % return ;0
Bài 8: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp mờ được biểu diễn bằng map.Trong đó mỗi phần tử được gán cho một số thực trong đoạn [0..1] biểu thị độ thuộc của phần tử trong tập hợp, với độ thuộc bằng 1 nghĩa là phần tử chắc chắn thuộc vào tập hợp và ngược lại độ thuộc bằng 0 nghĩa là phần tử chắc chắn không thuộc trong tập hợp.Phép giao và hợp của 2 tập hợp được thực hiện trên các cặp phần tử bằng nhau của 2 tập hợp, với độ thuộc mới được tính bằng phép tốn min và max của hai độ thuộc.
#include <iostream>#include <set>using namespace std;
template <class >
set T< > set_union(const set<> &, const set< > &){
% % set T< > ;t= a% % for (const v : ) {b% % % % t insert( );v
</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">% % }% % return ;t}
% % % % }% % }% % return ;t}
template <class >
void print_set(const std::set T< > &a{
% % for (const x : )a% % {
% % % % std::cout << x << ' ';% % }
% % std::cout << std::endl;}
int main(){
% % std::set<int> { , , , , a= 1 2 3 5 7};% % std::set<int> { , , , , b= 2 4 5 6 9};% % std::set<int> c=set_union(a, b);% % std::set<int> d=set_intersection(, );b% % std::cout << "Union: ";
% % print_set( );c
% % std::cout << "Intersection: ";% % print_set( );d
% % return ;0
}
</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">Bài 9: Cài đặt thuật toán Dijkstra trên đồ thị vô hướng được biểu diễn bằng danh sách kề sử dụngstd::priority_queue. Cụ thể, bạn cần cài đặt hàm vector<int> dijkstra(const vector< vector< pair<int, int> > >&adj) nhận đầu vào là danh sách kề chứa các cặp pair<int, int> biểu diễn đỉnh kề và trọng số tương ứng của cạnh. Đồ thị gồm n đỉnh được đánh số từ 0 tới n-1. Hàm cần trả `vector<int>` chứa n phần tử lần lượt là khoảng cách đường đi ngắn nhất từ đỉnh 0 tới các đỉnh 0, 1, 2, ..., n-1.
</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">#include <iostream>#include <queue>#include <climits>using namespace std;
struct compare{
% % bool operator() (pair<int, int> , a pair<int, int> b){% % % % return asecond > bsecond;
% % }};
vector<int> dijkstra(const vector vector pair< < <int, int>>> &adj){
% % priority_queue pair< <int, int>, vector<pair<int, int>>, compare>q;% % vector<int>dist(adj.size());
% % for(int i0; idist_size; i++){% % % % dist i[ ] = INT_MAX;% % }
% % dist[] ;=0
% % for(int i0; idist_size; i++){% % % % q push({i, dist[]});% % }
% % % % % % if(dist v[ ] >dist u[ ] + weight){% % % % % % % % dist v[ ] = dist u[ ] +weight;% % % % % % % % q push({v, dist[]});% % % % % % }
% % % % }% % }
% % returndist;}
int main(){
% % vector vector pair< < <int, int>>> adj( );% % auto add_edge [= &adj](int , int , v int )% % {
</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">% % % % adj u[ ].push_back({v, w});% % % % adj v[ ].push_back({u, w});% % };
% % add_edge(, , 1 4);% % add_edge(, , 7 8);% % add_edge(, , 7 11);% % add_edge(, , 2 8);% % add_edge(, , 3 7);% % add_edge(, , 8 2);% % add_edge(, , 4 9);% % add_edge(, , 5 14);% % add_edge(, , 5 10);% % add_edge(, , 6 2);% % add_edge(, , 7 1);% % add_edge(, , 8 6);% % add_edge(, , 8 7);
% % vector<int>distance dijkstra(adj);% % for (int ; i =0 i<distance.size(); ++i)% % {
% % % % cout << "distance " << 0<< "->" << << " = " << distance[] <<endl;
% % }% % return ;0
</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">#include <bits/stdc++.h>using namespace std;
</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">% % spush_back( .tsubstr(pre, t size() -pre));}
double score(string , t int ) {% % if (![ ][ ]t) {
% % % % return ;0
% % }
% % doubleidf log2(1.0 g t );% % doubletf =0.5 0.5 *d[ ]k[ ] /maxf[];% % returntf *idf;
% % % % distribute(s j[ ], t);% % }
% % for (int ; ; j =0 j<n j++) {% % % % maxf[] = 0;
% % % % for (string : s[ ]j) {% % % % % % if (! [].count(z)) {% % % % % % % % g[ ]z++;
% % % % % % }
% % % % % % d[ ]j[ ]++;
% % % % % % if (d[ ]j[] >maxf[ ]) {% % % % % % % % maxf[] = dj[ ]z;
</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">% % % % % % }% % % % }% % }% % cin >> ;
% % for (int ; i =1 i<= ; q i++) {% % % % string ;t
% % % % cout << idx +1 << "\n";% % }
Bài 11: Lịch trình chụp ảnh
Superior là một hịn đảo tuyệt đẹp với nn địa điểm chụp ảnh và các đường một chiều nối các điểm chụp ảnh với nhau. Đoàn khách tham quan có rr người với sở thích chụp ảnh khác nhau. Theo đó, mỗi người sẽ đưa ra danh sách các địa điểm mà họ muốn chụp. Bạn cần giúp mỗi ngườitrong đoàn lập lịch di chuyển sao cho đi qua các điểm họ yêu cầu đúng một lần, không đi qua điểm nào khác, bắt đầu tại điểm đầu tiên và kết thúc tại điểm cuối cùng trong danh sách mà họ đưa ra, và có tổng khoảng cách đi lại là nhỏ nhất.
</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">Test case 1:
Test case 2:
</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">Test case 3:
Test case 4:
</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">Test case 5:
#include <bits/stdc++.h>using namespace std;int , ;s
pair int, int a> 200005];
bool cmp(pair < int, int > x, pair < int, int > ) {y% % return (xsecond > ysecond);
int main() {
% % freopen("test.inp", "r", stdin);% % freopen("test.out", "w", stdout);
% % cin.tie(), cout.tie( )-> ios_base::sync_with_stdio(false);% % cin >> >> ;
% % for (int ; i =1 i<= ; n i++) {% % % % cin >> [ ].first >> [ ].second;% % }
% % priority_queue <int pq;% % sort( , a +n+ 1, cmp);% % long long ans ;
</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">% % for (int ; i =1 i<= ; n i++) {
% % % % while ( s>0 && pq.size() && pq.top() >= a[ ].i second) {% % % % % % ans -= pq.top();
% % % % % % pq.pop();% % % % % % s--;% % % % }
% % % % int min( , a[ ].i first /ai].second);% % % % s -= ;u
% % % % a[ ].i first-= a[ ].i second ;*u% % % % ans += [ ].first;
% % % % pq.push( [ia ].first);% % }
% % cout << ans;}
Bài 12: Đếm đường đi
Cho đồ thị vô hướng GG, hãy đếm số đường đi đi qua kk cạnh và không đi qua đỉnh nào quá mộtlần
Test case 1:
Test case 2:
</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">Test case 3:
Test case 4:
</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">#include <bits/stdc++.h>using namespace std;
int , [a1000005], [l1000005];int main()
% % freopen("test.inp", "r", stdin);% % freopen("test.out", "w", stdout);
% % cin.tie(), cout.tie( )->ios_base::sync_with_stdio(false);
% % cin >> ;
% % for (int ; i =1 i<= ; n i++)% % {
% % % % cin >> [ ];% % }
% % % % l i] (= st.size() ?st.top() :0);
</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">% % % % st.push( );i% % }
% % while (st.size())% % {
% % % % st.pop();% % }
% % long long ans ;
% % for (int ; ; i =n i>0 i--)% % {
% % % % while (st.size() && ai] <= ast.top()])% % % % {
% % % % % % st.pop();% % % % }
% % % % ans max(ans, 1ll ((* st.size() ? st.top() : n+1) -l i] -1) *a i[ ]);
% % % % st.push( );i% % }
% % cout << ans;}
</div>