Advertisement
IlidanBabyRage

asswecan.cpp

Jul 14th, 2015
189
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.43 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <cstdio>
  4.  
  5. using namespace std;
  6.  
  7. bool check(int *a, int n);
  8. bool asswecan1(int l, int *a, int n, int k);
  9. bool asswecan2(int l, int *a, int n, int k);
  10. int bs(int l, int r, int *a, int n);
  11.  
  12. int main(){
  13.     int n, a[100000];
  14.     cin >> n;
  15.     for (int i = 0; i < n; i++)
  16.         cin >> a[i];
  17.  
  18.     cout << bs(-1, n*8, a, n) << endl;
  19.  
  20.     return 0;
  21. }
  22.  
  23. int bs(int l, int r, int *a, int n){
  24.     int m;
  25.     while (l + 1 < r){
  26.         m = (l + r) / 2;
  27.         if (asswecan1(m, a, n, 0) || asswecan2(m, a, n, 0))
  28.             r = m;
  29.         else
  30.             l = m;
  31.     }
  32.     return r;
  33. }
  34.  
  35. bool asswecan1(int l, int *a, int n, int k){
  36.     if (check(a, n))
  37.         return true;
  38.     if (l == 0 || k == n)
  39.         return false;
  40.     int *b = new int[n];
  41.     for (int j = 0; j < n; j++)
  42.             b[j] = a[j];
  43.     for (int i = 0; i < l; i++){
  44.         b[k] /= 2;
  45.         if (asswecan1(l - i - 1, b, n, k + 1))
  46.             return true;
  47.         if (asswecan2(l - i - 1, b, n, k + 1))
  48.             return true;
  49.     }
  50.     return false;
  51. }
  52.  
  53. bool asswecan2(int l, int *a, int n, int k){
  54.     if (check(a, n))
  55.         return true;
  56.     if (l == 0 || k == n)
  57.         return false;
  58.     int *b = new int[n];
  59.     for (int j = 0; j < n; j++)
  60.             b[j] = a[j];
  61.     for (int i = 0; i <= l; i++){
  62.         if (asswecan1(l, b, n, k + 1))
  63.             return true;
  64.         if (asswecan2(l, b, n, k + 1))
  65.             return true;
  66.         b[k] *= 2;
  67.     }
  68.     return false;
  69. }
  70.  
  71. bool check(int *a, int n){
  72.     bool dowe = true;
  73.     for (int i = 1; i < n && dowe; i++)
  74.         dowe &= a[i] == a[i - 1];
  75.     return dowe;
  76. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement