Toliak

Подбор значений для условия >=

Jan 1st, 2018
252
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. function main(cond, omin, omax, k, k1) {
  2.     let n = 0;          //счетчик действий
  3.     while(k>=2) {
  4.         n++;
  5.         if (omin===0) break;
  6.         if (omin*k>=omax/k && omax/k>omin) {
  7.             omax/=k;
  8.         } else if (omin*k<omax && omax/k<=omin*k) {
  9.             omin*=k;
  10.         } else if (omax/k>omin*k) {
  11.             omax/=k;
  12.             omin*=k;
  13.         } else {
  14.             k/=2;
  15.             k = Math.floor(k);
  16.             continue;
  17.         }
  18.  
  19.  
  20.         if (cond(omin)) {
  21.             omax = omin;
  22.             omin /= k;
  23.             k/=2;
  24.             k = Math.floor(k);
  25.             continue;
  26.         } else if (!cond(omax)) {
  27.             omax *= k;
  28.             omin = omax/k;
  29.             k/=2;
  30.             k = Math.floor(k);
  31.             continue;
  32.         }
  33.     }
  34.    
  35.     let d = Math.max(Math.floor((omax - omin)/k1), 1);
  36.     while((omax-omin)!=1) {
  37.         n++;
  38.         if (omin+d>=omax-d && omax+d>omin) {
  39.             omax-=d;
  40.         } else if (omin+d<omax && omax-d<=omin+d) {
  41.             omin+=d;
  42.         } else if (omax-d>omin+d) {
  43.             omax-=d;
  44.             omin+=d;
  45.         } else {
  46.             d/=2;
  47.             d = Math.floor(d);
  48.             continue;
  49.         }
  50.  
  51.         if (cond(omin)) {
  52.             omax = omin;
  53.             omin -= d;
  54.             d/=2;
  55.             d = Math.floor(d);
  56.             continue;
  57.         } else if (!cond(omax)) {
  58.             omax += d;
  59.             omin = omax - d;
  60.             d/=2;
  61.             d = Math.floor(d);
  62.             continue;
  63.         }
  64.     }
  65.  
  66.     return [omax, n];
  67. }
  68.  
  69. function testPerformance(k1,k2) {
  70.     let sum = 0;
  71.     let wrong = 0;
  72.     const OPERATIONS = 1000000;
  73.     for (let i=0; i<OPERATIONS; i++) {
  74.         var c = Math.floor(Math.random()*1000000000)
  75.         var v = main(function(x) {return x>=c;}, 1, 1000000000, k1,k2);
  76.         if (c!==v[0]) wrong++;
  77.         sum+=v[1];
  78.     }
  79.     return [sum/OPERATIONS, wrong];
  80. }
Advertisement
Add Comment
Please, Sign In to add comment