青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

a tutorial on computer science

  C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
  21 隨筆 :: 0 文章 :: 17 評論 :: 0 Trackbacks

      這個題糾結了好久。首先想到的是暴搜,必超時。
    然后注意到題目中,天平左邊的物體和右邊的物體交替取,可能會使更快得到最優解,所以就根據他們的位置是否>0把他們放到兩個數組里,這里有個優化就是按照到達-1.5和+1.5的力矩排序,這樣如果取了前面的物體天平失去了平衡,則后面的物體也不用取了,一定會失去平衡。這樣繼續暴搜,還是超時。我估計這個優化沒什么用,因為就算你把剩下的都取完,也不需要浪費多少時間嘛。。。平均意義上能減少一般的時間。但是A(20,20)。。這個有點大。
     好吧,又繼續陷入僵局了。看別人的結題報告,發現主流版本是一堆亂糟糟的代碼,不懂在搞什么。。。后來偶然發現了一個版本,在暴搜的時候,寫的很奇怪,參見http://blog.csdn.net/wuli2496/article/details/7284641dfs(l,r),l,r表示前面l-1,r-1個已經取過了,這讓我煞是費解。(他的解法是把物體一個個的放到糾結的天平上),為什么不能先力矩放大的,后放力矩小的?然后我改了下他的dfs(),變成無參的,每次都從0開始找,交,超時了。作者沒有說明他為什么要這么做,或許是他不想說?或者他沒留意?而且這明明就不是個dfs了,如果可以證明,先放小的比先放大的好,那么這個dfs就是個DP了。和有限背包問題一樣的。好吧。然后我就想著證明為何先放力矩小的比先放力矩大的好,想了很久,發現,沒辦法。
    后來,偶然想到了一種方法,證明出
如果在當前的情況中,拿掉左邊力矩最大的,天平向右歪,并且拿掉右邊力矩最大的,天平向左歪,那么無論以后怎么拿,都不可能成功。
    這樣反推一下,剛剛好是一個dp。r[i][j]表示放上去了左邊前i個,右邊前j個的天平狀況(這種狀況剛剛好依賴于0-i,0-j的質量)。它只能由r[i][j-1],r[i-1][j]推出。
    額,這樣就是一個完美的背包問題了,只要20*20個狀態,交了,A掉了,跑的足夠快,理論上應該是最快的解法了吧?肯定比搜索快,也要比狀態壓縮的DP快,因為狀態壓縮的DP需要2^20個狀態。。。可能是我的代碼寫的太亂了,所以才跑到15名。。
    好了,最重要的的問題就是證明上面一段中紅色字的結論。
    現在我們把天平分成3段:第一段是最左邊到-1.5,中間是-1.5到1.5,右邊是1.5-最右邊。
    左邊的物體的力矩我們記為:WL(左邊最大那個力矩) + Lrest(左邊剩余力矩) ,中間的物體的力矩我們記為 C+Mrest(C表示中間那一段的模板質量,Mrest表示中間物體質量),右邊的力矩我們記為
 WR(右邊最大那個力矩)+Rrest(右邊剩余力矩)。
我們可以簡單地在左邊和右邊都剪掉Rrest。那么左邊,中間,右邊的力矩為WL+rest, C+Mrest,WR。如果拿掉左邊最大的右偏,我們可以得到式子 : rest + C + Mrest < WR 。那么很顯然,rest會越來越小,所以這個式子永遠成立,所以紅字得證。
好了,這個證明想了很久,而且中間用到了一個結論:拿掉天平左右兩邊等重的物體,對天平沒影響。對于有兩個平衡點的這只是個臆測,額好吧,誰有更好更簡單的解法歡迎交流。LRJ出的題果真很神,不過也很讓人糾結。代碼寫的比較亂,莫看。
#include <cstdio>
#include <cstdlib>
#include <cstring>

class node
{
  public:
    int pos,w;
};

class set
{
 public:
   int ll,lr,rl,rr;
   int prev,ok;
};

set res[30][30];

node lefts[110],rights[110];
int lcount,rcount;
int find;
int L,W,C;

int abs(int i)
{
  if(i>0) return i;
  return -i;
}

void pans(int l,int r)
{
  if(l == 0 && r== 0)
    return;
  if(res[l][r].prev == 1)
  {
    printf("%d %d\n",rights[r-1].pos/2,rights[r-1].w);
    pans(l,r-1);
  }
  else
  {
    printf("%d %d\n",lefts[l-1].pos/2,lefts[l-1].w);
    pans(l-1,r);
  }
}
int cmp1(const void* a,const void* b)
{
  node i = *(node*)a;
  node j = *(node*)b;
  return (-i.pos-3)*i.w - (-j.pos-3)*j.w;
}

int cmp2(const void* a,const void* b)
{
  node i = *(node*)a;
  node j = *(node*)b;
  return (i.pos-3)*i.w - (j.pos-3)*j.w;
}


int main()
{
   //freopen("in.txt","r",stdin);
   
//freopen("out.txt","w",stdout);
   int i,c=1,j; 
   int ll,lr,rl,rr;
   while(scanf("%d%d%d",&L,&W,&C)!=EOF && L>0)
   {
     memset(res,0,sizeof(res));
     L *= 2;
     ll = rr =0; rl = lr = 3*W;
     node tmp; 
     lcount = rcount = 0;
     for(i=0;i<C;i++)
     {
       scanf("%d%d",&tmp.pos,&tmp.w);
       tmp.pos*=2;
      if(tmp.pos<0)
         lefts[lcount++] = tmp;
       else
         rights[rcount++] = tmp;
     }
     qsort(lefts,lcount,sizeof(node),cmp1);
     qsort(rights,rcount,sizeof(node),cmp2);
     
     set tmpset = {ll,lr,rl,rr,0,1};
     res[0][0] = tmpset;
     for(i=0;i<=lcount;i++)
      for(j=0;j<=rcount;j++)
      {
        if(i-1>=0 && res[i-1][j].ok == 1)
            {
                  tmpset = res[i-1][j];
                  //放了第i個物體
                 if(lefts[i-1].pos < -3)
                   tmpset.ll += (-3-lefts[i-1].pos)*lefts[i-1].w; 
                 else
                   tmpset.lr += (lefts[i-1].pos+3)*lefts[i-1].w;
                 if(lefts[i-1].pos < 3)
                   tmpset.rl += (3 - lefts[i-1].pos)*lefts[i-1].w;
                 else
                   tmpset.rr += (lefts[i-1].pos - 3)*lefts[i-1].w;
                 if(tmpset.ll < tmpset.lr && tmpset.rl>tmpset.rr)
                 {
                    tmpset.ok = 1;
                    tmpset.prev = -1;
                    res[i][j] = tmpset;
                 }
                 else
                   {
                     res[i][j].ok = 0;
                 }
            }
              
              
         if(res[i][j].ok) 
              continue;
         if(j-1>=0 && res[i][j-1].ok == 1)
            {
              tmpset = res[i][j-1];
               if(rights[j-1].pos < -3)
                 tmpset.ll += (-3-rights[j-1].pos)*rights[j-1].w; 
               else
                 tmpset.lr += (rights[j-1].pos+3)*rights[j-1].w;
               if(rights[j-1].pos < 3)
                 tmpset.rl += (3 - rights[j-1].pos)*rights[j-1].w;
               else
                 tmpset.rr += (rights[j-1].pos - 3)*rights[j-1].w;
              if(tmpset.ll < tmpset.lr && tmpset.rl>tmpset.rr)
                 {
                    tmpset.ok = 1;
                    tmpset.prev = 1;
                    res[i][j] = tmpset;
                 }
                 else
                   {
                     res[i][j].ok = 0;
                 }
            }                      


      }
      printf("Case %d:\n",c++);
       if(res[lcount][rcount].ok == 1)
         pans(lcount,rcount);
       else
        printf("Impossible\n");
   }
   return 0;
}

posted on 2012-04-04 14:12 bigrabbit 閱讀(1824) 評論(2)  編輯 收藏 引用

評論

# re: uva 10123 - No Tipping 結題報告 2012-09-13 02:49 Jxy
暴搜加上二進制記錄以及搜過的狀態可以到0.184s  回復  更多評論
  

# re: uva 10123 - No Tipping 結題報告[未登錄] 2012-09-13 10:50 bigrabbit
@Jxy
我這個DP好像可以搞到0.02,求主頁  回復  更多評論
  


只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一二美女精品欧洲| 亚洲综合精品一区二区| 欧美成人激情视频| 久久午夜电影| 在线中文字幕不卡| 亚洲私人影院| 黄色成人av| 亚洲国产欧美国产综合一区| 欧美精品一区二区三区高清aⅴ| 亚洲丰满少妇videoshd| 亚洲美女黄色片| 国产精品永久免费视频| 久久久久久久综合日本| 免费在线欧美视频| 性刺激综合网| 久久免费视频在线观看| 中文精品99久久国产香蕉| 亚洲制服av| 亚洲第一中文字幕| 在线综合亚洲欧美在线视频| 国产专区精品视频| 亚洲国产天堂久久综合| 国产日韩精品综合网站| 亚洲大胆女人| 国产欧美欧洲在线观看| 亚洲国产乱码最新视频| 国产精品久久久久9999高清| 麻豆精品视频在线观看视频| 欧美日韩中文字幕精品| 美乳少妇欧美精品| 国产精品嫩草影院av蜜臀| 欧美成人三级在线| 国产深夜精品| 日韩一二三在线视频播| 一区二区在线观看视频| 亚洲一区二区三区免费视频| 在线国产亚洲欧美| 亚洲免费综合| 亚洲精品一区二区三区在线观看| 亚洲无线观看| 一区二区三区国产| 久久久久一区二区三区四区| 午夜欧美精品| 欧美日韩在线免费视频| 亚洲二区在线观看| 在线视频成人| 久久精品日产第一区二区| 亚洲欧美日韩在线| 欧美日韩精品在线播放| 欧美国产欧美综合| 国外成人在线| 欧美一级黄色网| 欧美在线欧美在线| 欧美体内she精视频| 亚洲人成亚洲人成在线观看| 在线免费观看欧美| 欧美在线免费| 久久精品亚洲精品| 国产日韩欧美在线播放不卡| 国产精品99久久久久久久久久久久| 亚洲精品一区二区三区婷婷月| 久久久无码精品亚洲日韩按摩| 久久精品二区| 国产欧美日韩免费| 性刺激综合网| 久久久久久国产精品一区| 国产一区二区三区电影在线观看| 亚洲欧美日本国产专区一区| 午夜在线观看免费一区| 国产欧美精品xxxx另类| 午夜亚洲性色福利视频| 久久久99久久精品女同性| 国内精品久久国产| 麻豆av一区二区三区久久| 欧美高清日韩| 日韩亚洲欧美在线观看| 欧美日韩免费高清| 亚洲一区网站| 久热综合在线亚洲精品| 亚洲国产精品一区二区第四页av| 看欧美日韩国产| 亚洲国产精品久久久久婷婷老年| 日韩视频在线观看一区二区| 欧美日韩一区自拍| 午夜精品一区二区三区在线视| 久久精品国产99| 亚洲第一久久影院| 欧美日韩在线影院| 欧美一区二区三区在线观看视频| 你懂的国产精品| 在线亚洲高清视频| 国产亚洲欧洲| 欧美刺激午夜性久久久久久久| 夜夜爽av福利精品导航| 久久精品理论片| 亚洲精品欧美专区| 国产麻豆91精品| 久久九九精品99国产精品| 亚洲国产成人精品女人久久久 | 欧美一区二区三区四区视频| 久久青草久久| 中文一区字幕| 精品1区2区| 国产精品久久久久久久久久直播 | 99在线精品视频在线观看| 欧美伊人久久久久久午夜久久久久| 一区二区三区在线高清| 欧美日本在线看| 久久精品卡一| 亚洲性感激情| 亚洲人成网站色ww在线| 久久久久久亚洲精品不卡4k岛国| 亚洲剧情一区二区| 国产综合自拍| 国产精品国色综合久久| 欧美韩日视频| 欧美中在线观看| 亚洲一级二级| 亚洲精品在线免费观看视频| 美脚丝袜一区二区三区在线观看| 亚洲午夜精品久久久久久app| 亚洲电影中文字幕| 国产拍揄自揄精品视频麻豆| 牛夜精品久久久久久久99黑人 | 欧美不卡在线| 久久国产精品第一页| 亚洲无限av看| 宅男噜噜噜66一区二区 | 国产一区二区毛片| 国产精品xnxxcom| 欧美美女视频| 欧美精品自拍| 欧美紧缚bdsm在线视频| 蜜桃久久av一区| 蜜桃av综合| 美日韩精品免费观看视频| 久久亚洲国产成人| 久久久久一区二区三区四区| 久久精品在线| 久久久久国产精品午夜一区| 久久激情五月激情| 久久精品成人一区二区三区 | 亚洲美女精品一区| 亚洲国产精品久久久久| 亚洲第一视频网站| 最近中文字幕mv在线一区二区三区四区| 蜜臀av性久久久久蜜臀aⅴ四虎| 久久女同互慰一区二区三区| 久久青青草综合| 欧美成人精品一区| 欧美激情精品久久久久久蜜臀| 欧美成人自拍视频| 亚洲黄色av一区| 日韩一区二区精品视频| 一区二区三区成人| 午夜精品福利视频| 久久久精品2019中文字幕神马| 久久一区二区精品| 欧美精品1区| 国产精品久久国产愉拍| 国产一区二区三区久久久久久久久 | 亚洲天堂成人在线视频| 亚洲欧美日韩国产中文在线| 欧美一区二区精美| 久久一区中文字幕| 欧美理论电影网| 国产精品亚洲综合一区在线观看| 国产一区二区三区的电影| 亚洲高清在线观看一区| 一区二区三区日韩欧美精品| 亚洲欧美激情视频在线观看一区二区三区| 欧美综合二区| 亚洲国产精品激情在线观看| 在线中文字幕日韩| 久久婷婷综合激情| 国产精品扒开腿做爽爽爽视频| 国产一区 二区 三区一级| 亚洲免费久久| 久久激情久久| 亚洲精品久久久久久下一站| 亚洲欧美一区二区激情| 欧美国产精品人人做人人爱| 国产精品高潮视频| 亚洲国产欧美一区二区三区久久| 亚洲一区二区在线观看视频| 卡通动漫国产精品| 亚洲一区二区伦理| 欧美国产在线观看| 国自产拍偷拍福利精品免费一| 中文国产亚洲喷潮| 欧美激情一区二区三区四区| 香蕉亚洲视频| 欧美午夜女人视频在线| 亚洲精华国产欧美| 久久婷婷麻豆| 亚洲欧美视频在线观看| 欧美图区在线视频| av不卡在线观看| 欧美大片第1页| 久久国产精品久久国产精品|