高級程式測驗

提供WOG各方面的技術問題,並提供最新path更新。

版主: 涅魂, 簫哥, 10度C~

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 請問裝備儲存方式問題

文章stu6707 » 2011-05-14 4:48 am

可是我沒問題耶 =口= 我是用appsev 2.5.10,裡面的php 是PHP 5.2.6,也可以執行阿

怪了...




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 請問裝備儲存方式問題

文章ETERNAL » 2011-05-14 11:41 am

stu6707 寫:可是我沒問題耶 =口= 我是用appsev 2.5.10,裡面的php 是PHP 5.2.6,也可以執行阿

怪了...


原來如此
用appsev的話 php.ini被改過了,不是原廠php.net的設定
原廠的php.ini設定的語法嚴整性跟安全性很高

語法上的錯誤有這幾個
1.
<?
要改成
<?php


2.
${m.$no}
要改成
${"m".$no}


其他應該沒什麼問題
我把你的程式改成可以跑不限層,現在在測試


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 請問裝備儲存方式問題

文章stu6707 » 2011-05-14 11:57 am

喔喔 學習了 @@

我想我寫的走進誤區了.. 計算6,7個組合時沒問題,可以在很快的時間內算出

不過16種組合就非常花時間.. 題目有要求要在minutes得出結果




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 請問裝備儲存方式問題

文章ETERNAL » 2011-05-14 12:07 pm

到e就跑不動了

已經過了大概有10分鐘,還沒跑出結果 @@

給大家參考一下

代碼: 選擇全部
<?php
//$f=$argv[1];
$f="data4.txt";
$show=file($f);
$maxnum=sizeof($show);
$m_final=array();
$m_list=array();
//set_time_limit(0);
$st_time=time();
$sum=0;
if($maxnum)
{
   $loop=0;
   $st_no=99999;
   $end_no=0;
   for($i=0;$i<$maxnum;$i++)
   {
      $data=explode(" ",$show[$i]);
      $data[0]=substr($data[0], 1);
      $data[1]=substr($data[1], 1);
      $data[2]=substr($data[2], 1);
      $no=$data[1];
      if($no <= $st_no) $st_no=$no;
      if(!isset(${"m".$no}))
      {
         ${"m".$no}=array();
      }
      ${"m".$no}[]=array(0=>$data[0],1=>$no,2=>$data[2],3=>$data[3]);
      if($no >= $end_no) $end_no=$no;
      $m_list[$data[0]]["money"]=$data[3];
   }
   $money_final=0;
   $total=$end_no-$st_no+1;
   foreach(${"m".$st_no} as $v)
   {
      $money=0;
      $t_m=array();
      $t_n=array();
      into($t_m,$t_n,$money,$v,$loop);
      schloop($t_m,$t_n,$money,($st_no+1),$loop);
   }
   asort($m_final);
}
$en_time=time();
echo "need time:".($en_time-$st_time)."秒";
//print_r($m_final);
echo "<br>";
echo "========================";
echo "<br>";
echo $money_final."\n";
echo "<br>";
echo implode(" ",$m_final)."\n";
echo "<br>";
echo $loop;
function schloop(&$t_m,&$t_n,&$money,$a1,$loop)
{
   global ${"m".$a1},$end_no,$money_final,$m_final,$m_final,$total,$sum,$m_list;
   $loop++;
   if(!isset(${"m".$a1}))
   {
      return;
   }
   foreach(${"m".$a1} as $v)
   {
      $sum++;
      if(in_array($v[2],$t_n))
      {
         continue;
      }
      into($t_m,$t_n,$money,$v,$loop);
      schloop($t_m,$t_n,$money,($a1+1),$loop);
      if(count($t_m)==$total)
      {
         if($money_final==0 || $money_final>$money)
         {
            $money_final=$money;
            $m_final=$t_m;
         }
      }
      $del=count($t_n)-1;
      $money-=$m_list[$t_m[$loop]]["money"];
      unset($t_n[$loop],$t_m[$loop]);
      if($sum>5000)
      {
         //exit;
      }
   }
}
function into(&$a1,&$a2,&$a3,$v,$a4)
{
   $a1[$a4]=$v[0];
   $a2[$a4]=$v[2];
   $a3+=$v[3];
}
?>


裡面有set_time_limit(0);
若怕跑不完,記得把set_time_limit(0);拿掉


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 高級程式測驗

文章stu6707 » 2011-05-14 1:40 pm

有個問題..

data4.txt裡面的M,C,price 一定是被一個空白格開,我是直接從網站複製下來,中間都是被3個空白隔開

還是需要用trim and preg_match來刪除多餘空白




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 12:08 am

stu6707 寫:有個問題..

data4.txt裡面的M,C,price 一定是被一個空白格開,我是直接從網站複製下來,中間都是被3個空白隔開

還是需要用trim and preg_match來刪除多餘空白


恩 是可以的

你可以改良一下在放上來

我剛想到一個方式可以加快計算一下速度

明天改上來


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 高級程式測驗

文章stu6707 » 2011-05-15 5:10 am

代碼: 選擇全部
      $data=explode(" ",$show[$i]);

上面加入
代碼: 選擇全部
      $show[$i]=preg_replace('/[\n\r\t]/',' ',preg_replace('/\s(?=\s)/','',trim($show[$i])));


我昨天從5.30跑到12.00,結果還沒出來.... 不知是程式自動停止了還是真的需要跑好幾小時




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 10:46 am

哈哈 你是跑 a b c d e f g 的哪一個?

你用下面這段程式跑看看,過程做了修改,也把你的檢查放進來
可以讓速度提高2-3倍,原本我跑d需要44秒,現在只要16秒
代碼: 選擇全部
<?php
//$f=$argv[1];
$f="data4.txt";
$show=file($f);
$maxnum=sizeof($show);
$m_final=array();
$m_list=array();
set_time_limit(0);
$st_time=time();
$sum=0;
if($maxnum)
{
   $loop=0;
   $st_no=99999;
   $end_no=0;
   for($i=0;$i<$maxnum;$i++)
   {
      $show[$i]=preg_replace('/[\n\r\t]/',' ',preg_replace('/\s(?=\s)/','',trim($show[$i])));
      $data=explode(" ",$show[$i]);
      $data[0]=substr($data[0], 1);
      $data[1]=substr($data[1], 1);
      $data[2]=substr($data[2], 1);
      $no=$data[1];
      if($no <= $st_no) $st_no=$no;
      if(!isset(${"m".$no}))
      {
         ${"m".$no}=array();
      }
      ${"m".$no}[]=array(0=>$data[0],1=>$no,2=>$data[2],3=>$data[3]);
      if($no >= $end_no) $end_no=$no;
      $m_list[$data[0]]["money"]=$data[3];
   }
   for($i=$st_no;$i<=$end_no;$i++)
   {
      usort(${"m".$i}, 'sort_by_money');
   }
   $money_final=0;
   $total=$end_no-$st_no+1;
   foreach(${"m".$st_no} as $v)
   {
      $money=0;
      $t_m=array();
      $t_n=array();
      $t_m[$loop]=$v[0];
      $t_n[$loop]=$v[2];
      $money+=$v[3];
      //into($t_m,$t_n,$money,$v,$loop);
      schloop($t_m,$t_n,$money,($st_no+1),$loop);
   }
   asort($m_final);
}
$en_time=time();
echo "need time:".($en_time-$st_time)."秒";
echo "<br>";
echo "========================";
echo "<br>";
echo $money_final."\n";
echo "<br>";
echo implode(" ",$m_final)."\n";
echo "<br>";
echo $loop;
function schloop(&$t_m,&$t_n,&$money,$a1,$loop)
{
   global ${"m".$a1},$end_no,$money_final,$m_final,$m_final,$total,$sum,$m_list;
   $loop++;
   if(!isset(${"m".$a1}))
   {
      return;
   }
   foreach(${"m".$a1} as $v)
   {
      $sum++;
      if(in_array($v[2],$t_n))
      {
         continue;
      }
      $t_m[$loop]=$v[0];
      $t_n[$loop]=$v[2];
      $money+=$v[3];
      //into($t_m,$t_n,$money,$v,$loop);
      if($money>$money_final && $money_final!=0)
      {
         $del=count($t_n)-1;
         $money-=$m_list[$t_m[$loop]]["money"];
         unset($t_n[$loop],$t_m[$loop]);
         //del_array($t_n,$t_m,$money,$loop);
         return;
      }
      schloop($t_m,$t_n,$money,($a1+1),$loop);
      if(count($t_m)==$total)
      {
         if($money_final==0 || $money_final>$money)
         {
            $money_final=$money;
            $m_final=$t_m;
         }
      }
      $del=count($t_n)-1;
      $money-=$m_list[$t_m[$loop]]["money"];
      unset($t_n[$loop],$t_m[$loop]);
      //del_array($t_n,$t_m,$money,$loop);
   }
}
function into(&$a1,&$a2,&$a3,$v,$a4)
{
   $a1[$a4]=$v[0];
   $a2[$a4]=$v[2];
   $a3+=$v[3];
}
function sort_by_money($a, $b)
{
   if($a[3] == $b[3]) return 0;
   return ($a[3] > $b[3]) ? 1 : -1;
}
function del_array(&$t_n,&$t_m,&$money,$loop)
{
   global $m_list;
   $del=count($t_n)-1;
   $money-=$m_list[$t_m[$loop]]["money"];
   unset($t_n[$loop],$t_m[$loop]);
}
?>


另外發現到,不去call function 可以讓程式比較快
用d來測試,去call function 需要20秒
不去call function可以縮短到16秒
你可以測試看看


水色論壇 http://www.et99.net
簡恩峻分享


ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 10:51 am

不過 e 我到現在還是一樣沒跑出來

如果你測試出來的話,麻煩把圖貼上來

我想知道要花幾秒鐘 = =


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 高級程式測驗

文章stu6707 » 2011-05-15 11:31 am

我跑 g........最長的那個 @@

用沒些改過的今天跑了6小時,還是沒出來.....

剛剛換上新程式碼在跑一遍,希望晚上可以出來...




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 2:11 pm

@@ 我想應該有更快的方法吧

可能有什麼特別的計算方式,可以更有效率的找出解答


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 高級程式測驗

文章stu6707 » 2011-05-15 3:19 pm

新程式碼已經跑了快4個小時,還是沒出來......

而且資源吃好多,90%的CPU & 1xx,xxx k記憶體 @@

已經嚴重拖慢電腦運作速度了 OTL 不得不關掉了

找天掛個10小時,看他出不出來..




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 3:24 pm

stu6707 寫:新程式碼已經跑了快4個小時,還是沒出來......

而且資源吃好多,90%的CPU & 1xx,xxx k記憶體 @@

已經嚴重拖慢電腦運作速度了 OTL 不得不關掉了

找天掛個10小時,看他出不出來..


是喔 @@

我是用4核心的CPU來跑,還好php是單執行緒,最多只吃掉我一個核心25%

記憶體1xx,xxx k很正常,我火狐多開了幾頁看網站也吃掉這麼多 @@


水色論壇 http://www.et99.net
簡恩峻分享

stu6707
 
文章: 162
註冊時間: 2008-10-26 1:00 pm

Re: 高級程式測驗

文章stu6707 » 2011-05-15 3:32 pm

怎麼差這麼多 =口= 我是雙核的,吃掉90%,四核才吃掉1/4

工作管理員顯示CPU都是被 http.exe (apache server)吃掉的

看來自架站真不好做




ETERNAL
 
文章: 2937
註冊時間: 2003-12-03 11:08 pm
性別: 男生

Re: 高級程式測驗

文章ETERNAL » 2011-05-15 9:04 pm

stu6707 寫:怎麼差這麼多 =口= 我是雙核的,吃掉90%,四核才吃掉1/4

工作管理員顯示CPU都是被 http.exe (apache server)吃掉的

看來自架站真不好做


我也是自架阿

雙核的話,正常來講應該只有50%是被apache server吃掉吧

另外40%應該是其他東西??


水色論壇 http://www.et99.net
簡恩峻分享

上一頁下一頁

回到 Online FF Battle-WOG官方聯盟推廣處

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 17 位訪客