24h購物| | PChome| 登入
2009-05-09 20:20:30| 人氣652| 回應0 | 上一篇 | 下一篇

2007 NOIP 普及組 NOIP2007 3.守望者的逃離

推薦 0 收藏 0 轉貼0 訂閱站台

作法:(1)DP(記憶體不夠)(2)枚舉(將所有可能展開)

想法:

  1. DP的想法:開2維x為時間 y為MP ....忽略
  2. 枚舉的想法:利用有魔法就必須放魔法的關鍵,因為有魔法就必須要放才會快,之後拚命跑,枚舉所有可能會休息的時間(剛開始的時間全部休息 之後先用魔法 再用跑的),利用該死的物理算出必須要走的時間,因為我物理不好,所以寫得很亂,有人能幫我修改嗎= =?

/**********************************************************/

#include<stdio.h>
#include<stdlib.h>
main()
{
 /* 枚舉停了幾次 */
 int M,S,T;
 while(scanf("%d %d %d",&M,&S,&T)==3)
   {
     int a,b,c,max=0,time=300001;
     for(a=0;a<T;a++)
      {
       int walk=0,temp=0;
       if(M+4*a>=10) /*將休息的時間 換成MP*/
         {
             if((M+4*a)/10*60>=S)
              {
               temp=a+((S%60==0)?(S/60):(S/60+1));
               if(temp>T) temp=T-a;
               walk=(temp-a)*60;
              }
             else 
              {
               temp=a+(M+4*a)/10;
               if(temp>T) {temp=T;walk=(T-a)*60;}
               else walk=(M+4*a)/10*60;
               int t=(int)(S-walk)/17.0;
               if(temp+t>T) 
                   {
                    walk=walk+(T-temp)*17;
                    temp=T;
                   }
               else
                   {
                    walk=walk+(t)*17;
                    temp=temp+t;
                   }
              }
         }
       else  /*全部走路*/
         {
          temp=a+((S%17==0)?(S/17):(S/17+1));
          if(temp>T) {temp=T-a;walk=temp*17;}
          else
          walk=walk+((S%17==0)?(S/17):(S/17+1))*17;
         }
        
       if(walk>=max&&temp<=time)/*將可以走的最遠距離紀錄*/
         {
          max=walk;
          time=temp;
         }
       if(walk>=S&&temp<=time) {max=walk;time=temp;}
      }
     if(max>=S)
      printf("Yes\n%d\n",time);
     else
      printf("No\n%d\n",max);
   }
 return 0;
}

 

台長: 來源不明

是 (若未登入"個人新聞台帳號"則看不到回覆唷!)
* 請輸入識別碼:
請輸入圖片中算式的結果(可能為0) 
(有*為必填)
TOP
詳全文