Nik_Perepelov

9 контест Насте Косаревой

Nov 17th, 2021 (edited)
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.90 KB | None | 0 0
  1. // 1
  2. #include <iostream>
  3. #include <vector>
  4.  
  5. using namespace std;
  6.  
  7. int height, width, a, b;
  8. int cnt = 0;
  9. int para_cnt = 0;
  10. vector<vector<int>> graph;
  11. vector<int> max_para;
  12. vector<int> used;
  13.  
  14. void init(int n) {
  15.     graph.resize(n);
  16.     used.resize(n);
  17.     max_para.resize(n, -1);
  18. }
  19.  
  20. void input() {
  21.     cin >> height >> width >> a >> b;
  22.  
  23.     init(height * width);
  24.     vector<string> input_string(height);
  25.     for (int i = 0; i < input_string.size(); i++) {
  26.         cin >> input_string[i];
  27.     }
  28.  
  29.  
  30.     for (int i = 0; i < height; i++) {
  31.         for (int j = 0; j < width; j++) {
  32.             if (input_string[i][j] == '.')
  33.                 continue;
  34.             cnt++;
  35.             if ((i + j) % 2 == 1)
  36.                 continue;
  37.  
  38.             if (j && input_string[i][j - 1] == '*')
  39.                 graph[i * width + j].push_back(i * width + j - 1);
  40.  
  41.             if ((i < height - 1) && input_string[i + 1][j] == '*')
  42.                 graph[i * width + j].push_back((i + 1) * width + j);
  43.             if (i && input_string[i - 1][j] == '*')
  44.                 graph[i * width + j].push_back((i - 1) * width + j);
  45.             if ((j < width - 1) && input_string[i][j + 1] == '*')
  46.                 graph[i * width + j].push_back(i * width + j + 1);
  47.         }
  48.     }
  49. }
  50.  
  51. int dfs(int vertex) {
  52.     if (used[vertex])
  53.         return 0;
  54.     used[vertex] = 1;
  55.     int to;
  56.     for (int i = 0; i < graph[vertex].size(); i++) {
  57.         to = graph[vertex][i];
  58.         if (max_para[to] == -1 || dfs(max_para[to])) {
  59.             max_para[to] = vertex;
  60.             return 1;
  61.         }
  62.     }
  63.     return 0;
  64. }
  65.  
  66. void solve() {
  67.     if (2 * b <= a) {
  68.         cout << cnt * b;
  69.         exit(0);
  70.     }
  71.  
  72.  
  73.  
  74.     for (int i = 0; i < height; i++) {
  75.         for (int j = 0; j < width; j++) {
  76.             if ((i + j) % 2 == 1)
  77.                 continue;
  78.             used = vector<int>(height * width, false);
  79.             dfs(i * width + j); // ищем парасочетание
  80.         }
  81.     }
  82.     for (int i = 0; i < height * width; i++)
  83.         if (max_para[i] != -1)
  84.             para_cnt++;
  85.  
  86. }
  87.  
  88. void print() {
  89.     cout << para_cnt * a + (cnt - 2 * para_cnt) * b;
  90. }
  91.  
  92. int main() {
  93.     input();
  94.     solve();
  95.     print();
  96.  
  97.     return 0;
  98. }
  99.  
  100. // 2
  101.  
  102. #include <iostream>
  103. #include <vector>
  104.  
  105. using namespace std;
  106.  
  107. int const DICE_SIDES = 6;
  108.  
  109. int height, width, a, b;
  110. int n;
  111. string name;
  112. int cnt = 0;
  113. int para_cnt = 0;
  114. vector<vector<int>> graph;
  115. vector<int> max_para;
  116. vector<int> used;
  117. vector<string> dices;
  118.  
  119.  
  120. void init() {
  121.     graph.resize(name.size());
  122.  
  123.     used.resize(n);
  124.     max_para.resize(n, -1);
  125.     dices.resize(n);
  126. }
  127.  
  128. void input() {
  129.     cin >> n >> name;
  130.  
  131.     init();
  132.  
  133.     if (name.size() > n){
  134.         cout << "NO";
  135.         exit(0);
  136.     }
  137.  
  138.     for (int i = 0; i < dices.size(); i++)
  139.         cin >> dices[i];
  140. }
  141.  
  142. int dfs(int vertex) {
  143.     if (used[vertex])
  144.         return 0;
  145.     used[vertex] = 1;
  146.     int to;
  147.     for (int i = 0; i < graph[vertex].size(); i++) {
  148.         to = graph[vertex][i];
  149.         if (max_para[to] == -1 || dfs(max_para[to])) {
  150.             max_para[to] = vertex;
  151.             return 1;
  152.         }
  153.     }
  154.     return 0;
  155. }
  156.  
  157. void solve() {
  158.     for (int i = 0; i < name.size(); i++)
  159.         for (int j = 0; j < n; j++)
  160.             for (int k = 0; k < DICE_SIDES; k++)
  161.                 if (name[i] == dices[j][k])
  162.                     graph[j].push_back(i);
  163.  
  164.     for (int i = 0; i < n; i++){
  165.         used = vector<int>(n, 0);
  166.         dfs(i);
  167.     }
  168.     for (int i = 0; i < max_para.size(); i++){
  169.         if (max_para[i] == -1)
  170.             cnt++;
  171.     }
  172. }
  173.  
  174. void print() {
  175.     if (cnt != 0) {
  176.         cout << "NO";
  177.     }
  178.     else {
  179.         cout << "YES" << endl;
  180.         for (int i = 0; i < name.size(); i++){
  181.             cout << max_para[i] + 1 << ' ';
  182.         }
  183.     }
  184. }
  185.  
  186. int main() {
  187.     input();
  188.     solve();
  189.     print();
  190.  
  191.     return 0;
  192. }
Add Comment
Please, Sign In to add comment