亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

HDU5014Number Sequence(貪心)

系統(tǒng) 1746 0

HDU5014Number Sequence(貪心)

題目鏈接

題目大意:
給出n,然后給出一個(gè)數(shù)字串,長度為n + 1, 范圍在[0, n - 1].然后要求你找出另外一個(gè)序列B,滿足上述的要求,而且使得t = A0^B0 + Ai + 1 ^ Bi + 1 + ... + An ^ Bn 最大。

解題思路:
對(duì)于一個(gè)數(shù)字進(jìn)行異或,要求結(jié)果最大的話,那么取這個(gè)數(shù)字的二進(jìn)制互補(bǔ)數(shù)字是最好的情況,而且能夠發(fā)現(xiàn)每次找到一個(gè)數(shù)字和相應(yīng)的互補(bǔ)的數(shù)字都會(huì)是一段區(qū)間。就這樣一段一段區(qū)間的去尋找每一個(gè)點(diǎn)相應(yīng)的最好的匹配點(diǎn)。

代碼:

      
        
          #
          
            include
          
           <cstdio>
        
        
          #
          
            include
          
           <cstring>
        
        
          typedef
        
        
          long
        
        
          long
        
         ll;

        
          const
        
        
          int
        
         N = 
        
          1e5
        
         + 
        
          5
        
        ;

        
          const
        
        
          int
        
         M = 
        
          20
        
        ;


        
          int
        
         num[N];

        
          int
        
         Map[N];

        
          int
        
         n;
ll t[M];


        
          void
        
         init () {

    t[
        
          0
        
        ] = 
        
          1
        
        ;
    
        
          for
        
         (
        
          int
        
         i = 
        
          1
        
        ; i <= M; i++)
        t[i] = t[i - 
        
          1
        
        ] * 
        
          2
        
        ;
}


        
          int
        
         main () {

    init();
    
        
          while
        
         (
        
          scanf
        
         (
        
          "%d"
        
        , &n) == 
        
          1
        
        ) {

        
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i <= n; i++)
            
        
          scanf
        
         (
        
          "%d"
        
        , &num[i]);

        
        
          int
        
         rear = n;
        
        
          int
        
         front;
        ll ans = 
        
          0
        
        ;

        
          // printf ("%lld\n", t[M - 1]);
        
        
          while
        
         (rear >= 
        
          0
        
        ) {

            
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i < M; i++)
                
        
          if
        
         (t[i] > rear) {
                    front = t[i] - rear - 
        
          1
        
        ;
                    
        
          break
        
        ;        
                }

            
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i < (rear - front + 
        
          1
        
        ) / 
        
          2
        
        ; i++) {

                Map[rear - i] = front + i;
                Map[front + i] = rear - i;
            }

            
        
          if
        
         (rear == front)
                Map[rear] = front;
            rear = front - 
        
          1
        
        ;
        }

        
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i <= n; i++)
            ans += num[i] ^ Map[num[i]];
        
        
          printf
        
         (
        
          "%lld\n"
        
        , ans);
        
        
          for
        
         (
        
          int
        
         i = 
        
          0
        
        ; i < n; i++)
            
        
          printf
        
        (
        
          "%d "
        
        , Map[num[i]]);
        
        
          printf
        
         (
        
          "%d\n"
        
        , Map[num[n]]);
    }
    
        
          return
        
        
          0
        
        ;
}
      
    

HDU5014Number Sequence(貪心)


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 五月天婷婷缴情五月免费观看 | 色综合一本到久久亚洲91 | 欧美狠狠干 | 久草在线视频资源站 | 欧美日韩一区二区三区久久 | 三级a做爰大乳在线观看 | 国产一二三区在线观看 | 激情影院免费 | 男人边吃奶边爱边做视频日韩 | 亚洲精品美女久久久aaa | 欧美日韩黄色大片 | 福利院肉动漫视频在线观看 | 色老头老太做爰视频在线观看 | 99视屏| 擼擼色在线看观看免费 | 日韩免费黄色片 | 久久精彩免费视频 | 国产欧美在线观看一区二区 | 亚洲精品丝袜在线一区波多野结衣 | 成人精品一区二区三区 | 中文字幕美日韩在线高清 | 97成人在线视频 | 日本一级毛片不卡免费 | 丹武至尊在线观看动漫 | 久久亚洲伊人中字综合精品 | 九九热伊人 | 操综合 | 日本免费一区二区久久人人澡 | 欧美精品一区二区三区视频 | 亚洲综合在线成人一区 | 国产青草视频免费观看97 | 亚洲热在线观看 | 成人性毛片| 麻豆精品一区二区三区免费 | 成年女人毛片免费播放人 | 国产精品99爱免费视频 | 色姑娘色综合 | 性做爰片视频毛片 | 免费鲁丝片一级观看 | 偷偷操99 | 久久久久在线 |